C# - SHORT数据类型是短整型还是仍然是整型?

10

我正在进行一些分类,但不确定:

INT是一个带有关键字“int”的基本数据类型

但我可以使用Int16、Int32或Int64——我知道C#有它们自己的名称。但它们是否也是数据类型,还是仍然是INT?主要的是,“short”是一种数据类型还是INT16是一种数据类型?谢谢 :)

INT是整数的缩写,是C#中的基本数据类型。而Int16、Int32和Int64都是整数类型,也是C#中的数据类型,它们分别表示16位、32位和64位的有符号整数。另外,"short"是Int16的别名,因此既可以说"short"是一种数据类型,也可以说Int16是一种数据类型。

3个回答

26

在C#中,以下内容始终为真:

  • short == Int16
  • ushort == UInt16
  • int == Int32
  • uint == UInt32
  • long == Int64
  • ulong == UInt64

两个版本均为数据类型。以上均为长度和有符号性不同的整数。

据我所知,两个版本主要区别是在Visual Studio中突出显示的颜色不同。


颜色可能与它们是否为关键字相关。因此,您可以将变量命名为Int32,但不能命名为int - Philipp
3
@Steven 别忘了,typeof(int) 的结果是 Int32,在堆栈跟踪等地方也会显示为该类型。因此了解这一点仍然很有用。 - Mike Caron
1
左列中的所有类型都只是右列中类型的别名!这些类型之间唯一的区别在于语法上的使用。左侧的类型存在是为了让程序员更轻松地编写代码。 - Henri
4
@Philipp:你仍然可以使用 int 作为名称,只需要在前面加上 '@' 符号 - 例如:int @int = 0;。名称仍然是 int。虽然我不建议这样做 :) - Jon Skeet
值得一提的是,如果包含类名,则必须包含其命名空间System。如果使用关键字,则无需添加命名空间。 - AzzamAziz
显示剩余3条评论

3

short 是一种表示 16 位整数的数据类型(比 int 低一阶,后者为 32 位)。

Int16 实际上也是一种数据类型,与 short 同义。也就是说,

Int16.Parse(someNumber);

也返回一个short,与以下代码相同:

short.Parse(someNumber)

同样适用于intInt32longInt64

2
在C#中,int只是System.Int32的简称。
在.NET中,即使是基本数据类型也实际上是对象(派生自System.Object)。
因此,在C#中的int = VB.Net中的Integer = System.Int32。
这里有一个所有.NET数据类型的表格:http://msdn.microsoft.com/en-us/library/47zceaw7%28VS.71%29.aspx 这是.NET公共类型系统的一部分,它允许.NET语言之间无缝互操作。 Common Type System

“在.NET中,即使是基本数据类型也实际上是对象”你确定吗?我一直认为基元类型不是从对象派生的,并且从对象转换和转换到对象需要装箱和拆箱(这是C#编译器隐藏了的,但仍然发生在IL级别。旧的托管C++(在C++/CLI之前)使用__box和__unbox或类似的东西明确表示) - Ben Schwehn
@Ben:这是Java。在.NET中,值类型可以未装箱而存储,但它们仍然从System.Object逻辑派生,因此它们始终可以用于要求Object的位置。是的,这意味着它们会自动装箱,并且装箱版本明确派生自Object - Steven Sudit
1
我认为你们两个都是对的。在幕后,int通常是一个4字节的内存块,但在逻辑上它是从对象派生的结构体,并且必要的自动装箱发生以维持这种外观。因此,真正的问题是它是否是一个对象取决于你所讨论的概念层面。 - Jon Hanna
所以我查看了Richter的CLR via C#,我认为正在发生的是:所有值类型都派生自System.ValueType,而System.ValueType本身派生自System.Object。因此说所有基元类型都是对象是正确的!ValueTypes在堆栈上分配。装箱在堆上分配必要的内存,还有两个额外的字段(类型对象指针和同步块索引)需要堆上的对象,然后将ValueType复制到新分配的堆内存中。装箱不会自动发生,但c#编译器会自动插入所需的装箱IL代码。 - Ben Schwehn
因此,所有的对象都是对象,但是堆栈上的对象与堆上的对象的行为不同。因此,区别不在于“派生自对象”的事物与“不派生自对象”的事物,而在于“堆栈”与“堆”。如果我没记错的话,c++/CLI允许将任意对象(即不派生自ValueType的对象)放在堆栈上。 - Ben Schwehn
哇... 在几乎我读过的每一本 .Net 入门书和文章中,都已经涵盖了这个问题的讨论,更不用说官方文档已经详细介绍了此内容,我在刚开始的回答中也提供了链接。点击我的回答中的共同类型系统链接,然后再点击第一个链接,可以跳转到这个网页: http://msdn.microsoft.com/en-us/library/2hf02550%28VS.71%29.aspx,其中清楚地描述了你所谈论的一切,并且支持我的简短回答。 - David

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