8

我一直试图了解 Java 和 C# 中“原语”的使用以及它们之间的区别(如果有的话)。我已经就 SO 提出了一系列问题,其中一些答案似乎混淆了这个问题,而不是澄清它。一些答案(和一些 MS 文档)似乎提供了相互矛盾的陈述。从 SO

并来自 MS: http: //msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx - “结构与类非常相似” - “Int32类包装int数据类型” - “另一方面,C# 中的所有原始数据类型都是 System 命名空间中的对象。对于每种数据类型,都提供了一个短名称或别名。例如,int是 System.Int32 的短名称”。

我的困惑主要在于 C#(我已经编写了一段时间的 java 程序)。

编辑@Jon Skeet 已确认以下段落是正确的

  • Java 有两种类型(原始类型和类)。“值类型”这个词可能是原始(尽管没有广泛使用)的同义词,也是类的“引用类型”的同义词。Java 在类 (Integer) 中“包装”原语 (int),这些类具有任何其他类的完整功能(可以为 null,用于集合等)

编辑@Jon 对 C# 给出了非常明确的声明,所以我将删除我建议的事实并参考他的回答。

进一步的问题:对于这些术语的实际使用应该是什么达成共识?如果有共识,我将非常感谢明确说明。否则,我认为术语是混乱的,因此用途有限。

总结感谢您提供非常明确的答案。真正理解这一点的人达成了共识(参见@Jon 接受的答案),MS 文档是一致的(尽管他们在某些地方提到了 Java,而我误读了这些 C#)

4

2 回答 2

13

我没有看到 MS 文档对此有矛盾(MSDN 有时是错误的,但在这个特定问题上,我一直认为它是正确的)。您发布的 MSDN 链接说:

对于 Java中的每种原始数据类型,核心类库都提供了一个包装类,将其表示为 Java 对象。例如,Int32 类包装了 int 数据类型,而 Double 类包装了 double 数据类型。

另一方面,C# 中的所有原始数据类型都是 System 命名空间中的对象。对于每种数据类型,都提供了一个短名称或别名。例如,int 是 System.Int32 的简称,double 是 System.Double 的简称。

基本上,它说的是正确的事情。在 Java 中,Integer类是int原始类型的包装器。在 C# 中,intSystem.Int32结构的别名。第一段是关于 Java 的,不适用于 C#。


在 .NET 中,术语如下:

原始类型IsPrimitive属性设置为 true的类型。原始类型是:

基本类型是 Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double 和 Single。

所有原始类型都是值类型,但反之则不然。

类型具有值语义的类型,与引用语义相反。当按值(而不是其引用)传递时,将复制整个值。值类型的局部变量存储在堆栈中。structs 和 enums 是值类型。

如上所述,所有原始类型都是值类型。它们structSystem命名空间中。在 C#、intdouble等中,关键字基本上是那些structs 的别名。

于 2009-10-21T09:09:47.207 回答
13

第一个要点是正确的。

第二个不是: .NET 中的原始类型是 Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double 和 Single。结构通常不能设置为null,但也有可以为空的值类型 ( Nullable<T>)。这些仍然是值类型,但在 C# 中有语法糖将“null”等同于“类型的 null 值”,对于可为 null 的值类型,它是HasValue返回 false 的实例。

int并且System.Int32 C# 中的确切同义词。前者只是后者的别名。它们编译成完全相同的代码。

在 C# 中,类和接口始终是引用类型。结构和枚举是值类型 - 但是每个结构都有一个装箱等效项(除了Nullable<T>CLR 在装箱方面的处理方式不同)。装箱的类型没有单独的名称,并且不能在 C# 中显式引用(尽管它们可以在 C++/CLI 中)。没有像.NET 中那样的单独包装类等价物;java.lang.Integer引入这样的类是有问题的,因为您可以在 .NET 中创建自己的值类型,这与 Java 不同。

有关引用类型和值类型的更多信息,请参阅我的文章

于 2009-10-21T09:14:30.987 回答