在.NET中,int(又名Int32
)是一个对象还是原始类型?(我不是在问int?
)。
我在保存的单词int
上按了F12,得到了:
public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>
{ ... }
它不继承自Object,这是否意味着int
是原始类型?
在.NET中,int(又名Int32
)是一个对象还是原始类型?(我不是在问int?
)。
我在保存的单词int
上按了F12,得到了:
public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>
{ ... }
它不继承自Object,这是否意味着int
是原始类型?
int
类型不继承自 object
类型。将 int
值分配给 object
变量称为装箱。 - Yacoub MassadSystem.Object
》的说明,所有的类、结构体、枚举和委托都继承自System.Object
。而System.Int32
是一个结构体。请自行得出结论。 - O. R. Mapperobject
- 否则它怎么会覆盖 Equals
,GetHashCode
等方法呢?装箱与表示有关,而不是继承。 - Jakub Lortzint xx = 1; if (xx is object) { Console.Write("yeap"); }
- JANint
赋值给 object
(object a = 12;
),但是你不能将一个 int
或其他结构体在接口的协变位置上视为对象 (IEnumerable<object> b = Enumerable.Repeat(5,1);
失败)。因此从这个意义上讲,它并不总是像一个对象一样行为。 - theStrawManInt32
是一个结构体,类似于一种类型(编译时)而不是对象(运行时)。因此,您不能说“Int32
是一个对象”,但您可以说“Int32
继承自对象”。int
和Int32
是同义词,其中Int32
更适用于读者关心位数长度的操作(位操作,溢出情况等)。参考此 MSDN 网站,有15种内置类型,其中2种是类(object和string),其余都是原始类型:
bool - System.Boolean
byte - System.Byte
sbyte - System.SByte
char - System.Char
decimal - System.Decimal
double - System.Double
float - System.Single
int - System.Int32
uint - System.UInt32
long - System.Int64
ulong - System.UInt64
object - System.Object
short - System.Int16
ushort - System.UInt16
string - System.String
Type.IsPrimitive
提供了一个有点不同的类型列表,被认为是.NET Framework作为一个整体的原始类型。 - O. R. Mapperint
字面量上调用 GetType
,而 GetType
声明在 System.Object
中。 - w.bint xx = 1; if (xx is object) { Console.Write("yeap"); }
- JANInteger
、Double
等。然而,这些都是引用类型,与原始类型int
、double
等不同,并且不能互换。在C#中,您始终将任何原始类型强制转换为object
或其可空对应项。这是由于卓越的装箱/拆箱功能。C#中的原始类型是值类型,并按原样存储在堆栈上。 - KędrzuMSDN - "原始类型通过关键字进行标识,这些关键字是System命名空间中预定义类型的别名。原始类型与其别名类型完全无法区分:编写保留字int与编写System.Int32完全相同。 由于原始类型是别名类型,因此每个原始类型都有成员。例如,整数具有在System.Int32中声明的成员。文字可以被视为其对应类型的实例。"
基本上,int和Int32是同义词;当您只需要“整数”时,您会倾向于使用int,而在使用Int32时,大小明确显示,因此未来的维护者将知道如果适当的话可以放大一个int,但应小心更改Int32变量。使用两者得到的代码将是相同的,但区别仅在于代码的可读性或者也可以称之为代码展示。
您可以阅读《应用.NET框架编程》-作者Jeffrey Richter很好地举了一个使用完整类型名称的例子。以下是我记住的主要内容:
类型名称在.NET语言之间可能会有所不同。例如,在C#中,long映射到System.Int64,而在带托管扩展的C++中,long映射到Int32。由于在使用.NET时可以混合和匹配语言,因此无论读者喜欢的语言是什么,使用显式类名始终更清晰明了。
一开始可能有点混淆。在网上和书籍中,人们都说关于C#:所有类型都派生自Object类型,这是真的,但在某些ValueType类型的情况下,它们不会显式地继承。
此外,int等其他值类型是使用结构体构建的,而不是像引用类型那样使用类。
System.ValueType
的基类型由struct
关键字隐含确定。在其他语言(如Java)中,对象和基本类型有所区别,但在.NET中,类型系统是统一的。所有非指针、非接口类型都继承自System.Object
。 - Mike Zboray