在.NET中,int (Int32)被认为是一个原始类型而不是对象吗?

11

在.NET中,int(又名Int32)是一个对象还是原始类型?(我不是在问int?)。

我在保存的单词int上按了F12,得到了:

public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>

{ ... }

它不继承自Object,这是否意味着int是原始类型?


3
这是一个结构体,不允许指定基类型。System.ValueType的基类型由struct关键字隐含确定。在其他语言(如Java)中,对象和基本类型有所区别,但在.NET中,类型系统是统一的。所有非指针、非接口类型都继承自System.Object - Mike Zboray
你的意思是Int32是“编程语言提供的基本构建块数据类型”吗?原始数据类型 - Tom Blodget
想知道为什么它没有显示Int32继承Object,因为它确实是这样的。 - IEnjoyEatingVegetables
6个回答

7

所有的C#代码都继承自object,包括int

来自msdn:

Int32是代表有符号整数的不可变值类型

并且

引用类型和值类型都派生自最终基类Object。


1
这不是正确的。int 类型不继承自 object 类型。将 int 值分配给 object 变量称为装箱。 - Yacoub Massad
4
根据《MSDN on System.Object》的说明,所有的类、结构体、枚举和委托都继承自System.Object。而System.Int32是一个结构体。请自行得出结论。 - O. R. Mapper
1
@YacoubMassad 它确实继承自 object - 否则它怎么会覆盖 EqualsGetHashCode 等方法呢?装箱与表示有关,而不是继承。 - Jakub Lortz
4
"(1 is object)"返回true。所以我想你们是对的。 - Yacoub Massad
好的,我试过了这个代码,并且结果是:int xx = 1; if (xx is object) { Console.Write("yeap"); } - JAN
1
这个答案并不像它表现得那么明确。你可以使用装箱将 int 赋值给 objectobject a = 12;),但是你不能将一个 int 或其他结构体在接口的协变位置上视为对象 (IEnumerable<object> b = Enumerable.Repeat(5,1); 失败)。因此从这个意义上讲,它并不总是像一个对象一样行为。 - theStrawMan

4
Int32是一个结构体,类似于一种类型(编译时)而不是对象(运行时)。因此,您不能说“Int32是一个对象”,但您可以说“Int32继承自对象”。
结构体是ValueType,而ValueType派生自object。 intInt32是同义词,其中Int32更适用于读者关心位数长度的操作(位操作,溢出情况等)。

3

参考此 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

2
这些类型是内置于C#中的,这并不一定意味着它们内置于.NET作为一个整体。此外,请注意链接页面提到了“简单类型”,这是C#的一个概念,可能与“原始类型”并不完全相同。Type.IsPrimitive提供了一个有点不同的类型列表,被认为是.NET Framework作为一个整体的原始类型。 - O. R. Mapper
C# 中没有原始类型,您可以在任何 int 字面量上调用 GetType,而 GetType 声明在 System.Object 中。 - w.b
尝试这段代码:int xx = 1; if (xx is object) { Console.Write("yeap"); } - JAN
1
你可能应该考虑一下C#和Java中原始类型的实现差异。Java假装是完全面向对象的语言,并且具有从基本对象类型派生的类型IntegerDouble等。然而,这些都是引用类型,与原始类型intdouble等不同,并且不能互换。在C#中,您始终将任何原始类型强制转换为object或其可空对应项。这是由于卓越的装箱/拆箱功能。C#中的原始类型是值类型,并按原样存储在堆栈上。 - Kędrzu

1
原始类型是通过关键字识别的,所以是的,int是一个原始类型。
原始类型还允许您将其用作文字值。
但是,关键字标识的基础类型是System.Int32,它不是原始类型。 这是一种值类型,而不是引用类型(或对象)。

1
我认为这个定义有问题,因为它缺乏对“原始类型”一词的范围限定。原始类型是指什么?.NET框架?那么,这个定义就不正确了,因为不同的.NET语言可以有不同的关键字集合。还是指某种编程语言?那么我想知道这是否符合所询问的内容。 - O. R. Mapper
1
你所提到的“原始类型”定义是针对VB.NET的。 - O. R. Mapper

0

MSDN - "原始类型通过关键字进行标识,这些关键字是System命名空间中预定义类型的别名。原始类型与其别名类型完全无法区分:编写保留字int与编写System.Int32完全相同。 由于原始类型是别名类型,因此每个原始类型都有成员。例如,整数具有在System.Int32中声明的成员。文字可以被视为其对应类型的实例。"

基本上,intInt32是同义词;当您只需要“整数”时,您会倾向于使用int,而在使用Int32时,大小明确显示,因此未来的维护者将知道如果适当的话可以放大一个int,但应小心更改Int32变量。使用两者得到的代码将是相同的,但区别仅在于代码的可读性或者也可以称之为代码展示。

您可以阅读《应用.NET框架编程》-作者Jeffrey Richter很好地举了一个使用完整类型名称的例子。以下是我记住的主要内容:

类型名称在.NET语言之间可能会有所不同。例如,在C#中,long映射到System.Int64,而在带托管扩展的C++中,long映射到Int32。由于在使用.NET时可以混合和匹配语言,因此无论读者喜欢的语言是什么,使用显式类名始终更清晰明了。


0
在C#中,intInt32的别名,并且它们的行为完全相同。通常情况下,为了可读性和明确性,人们会使用Int32而不是int。现在,不幸的是,你的问题并不能简单地用一个来回答。- int 隐式地派生自ValueType类型,而ValueType类型本身又派生自Object类型。因此,在C#中,所有类型实际上派生自Object类型。
但是,由于ValueType无法显式地派生(因为它是一个抽象类),编译器需要并且确实知道int是隐式地继承自ValueType的。所以int确实从Object类型派生,只是不是显式地派生。
虽然int不是引用类型,但它仍然可以像引用类型一样对待(就像是从Object类型显式地派生的类型),这是通过一种称为装箱的过程实现的。

一开始可能有点混淆。在网上和书籍中,人们都说关于C#:所有类型都派生自Object类型,这是真的,但在某些ValueType类型的情况下,它们不会显式地继承。

此外,int等其他值类型是使用结构体构建的,而不是像引用类型那样使用类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接