Java和C#中"primitive","value type","struct","class","wrap"的定义

pet*_*ust 7 c# java primitive struct value-type

我一直试图理解在Java和C#中使用"原语"以及它们之间的区别(如果有的话).我已经提出了一系列关于SO的问题,一些答案似乎混淆了问题而不是澄清它.一些答案(和一些MS文档)似乎提供了相互矛盾的陈述.来自SO

和从MS:http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx - "结构是非常相似的类" - "的Int32类包装int数据类型" - "在另一方面,在C#所有原始数据类型是在系统的命名空间的对象.对于每个数据类型,短名称或别名,提供了,例如,int是用于System.Int32短名称".

我的困惑很大程度上与C#(我已经编程java一段时间)有关.

编辑以下段落已被@Jon Skeet确认为正确

  • Java有两种类型(原始类和类).单词"value type"可以是基元的同义词(虽然没有广泛使用)和类的"引用类型".Java在类(整数)中"包装"原语(int),这些类具有任何其他类的完整功能(可以为null,在集合中使用等)

编辑 @Jon已经对C#做了非常明确的陈述,所以我将删除我建议的真相并参考他的答案.

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

总结感谢您非常明确的答案.在那些真正了解这一点并且MS文档是一致的人之间存在共识(参见@Jon接受的答案)(尽管他们在某些地方引用了Java而我误解了这些用于C#)

Meh*_*ari 12

我没有看到MS文档与此相矛盾(MSDN有时是错误的,但在这个具体问题上,我总是看到它是正确的).您发布的MSDN链接说:

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

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

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


在.NET中,术语如下:

一个基本类型是一个类型IsPrimitive属性设置为true.原始类型是:

基元类型是布尔,字节,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single.

所有原始类型都是值类型,但反之亦然.

值类型是一个具有值语义,相对于参考语义类型.通过值(而不是其引用)传递时,将复制整个值.值类型的局部变量存储在堆栈中.structs和 enums是值类型.

如上所述,所有原始类型都是值类型.它们struct位于System命名空间中.在C#中int,double等等,关键字基本上别名为那些struct秒.


Jon*_*eet 12

第一个要点是正确的.

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

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

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

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