Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “的定义”;原语&引用;值类型"&引用;结构"&引用;“类”&引用;“包装”;在Java和C中#_C#_Java_Struct_Primitive_Value Type - Fatal编程技术网

C# “的定义”;原语&引用;值类型"&引用;结构"&引用;“类”&引用;“包装”;在Java和C中#

C# “的定义”;原语&引用;值类型"&引用;结构"&引用;“类”&引用;“包装”;在Java和C中#,c#,java,struct,primitive,value-type,C#,Java,Struct,Primitive,Value Type,我一直在努力理解Java和C#中“原语”的用法以及它们之间的区别(如果有的话)。我就此提出了一系列问题,其中一些答案似乎混淆了问题,而不是澄清问题。一些答案(和一些MS文档)似乎提供了相互矛盾的陈述。从此 和MS: -“结构与类非常相似” -“类包装int数据类型” -“另一方面,C#中的所有基本数据类型都是系统命名空间中的对象。对于每个数据类型,都提供了一个短名称或别名。例如,int是System.Int32的短名称。” 我的困惑主要在于C(我编写java已经有一段时间了) 编辑以下段

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

和MS: -“结构与类非常相似” -“类包装
int
数据类型” -“另一方面,C#中的所有基本数据类型都是系统命名空间中的对象。对于每个数据类型,都提供了一个短名称或别名。例如,
int
是System.Int32的短名称。”

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

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

  • Java有两种类型(基元和类)。“值类型”可以是基本类型(虽然没有广泛使用)的同义词,也可以是类的“引用类型”。Java将原语(int)封装在类(Integer)中,这些类具有任何其他类的全部功能(可以为null,用于集合等)
EDIT@Jon对C#给出了非常明确的陈述,因此我将删除我建议的事实,并参考他的答案

进一步的问题:对于这些术语的实际用法是否有共识?如果有一个共识,我将非常感谢它明确地表达出来。否则,我假设术语是混乱的,因此使用有限


总结感谢您给出非常清晰的答案。在真正理解这一点的人中有一个共识(见@Jon的公认答案),MS文档是一致的(尽管他们在某些地方提到Java,我把它们误读为C#)。

我没有看到MS文档在这一点上相互矛盾(MSDN有时是错误的,但在这个具体问题上,我一直认为它是正确的)。您发布的MSDN链接显示:

对于Java中的每个基本数据类型, 核心类库提供了 将其表示为 Java对象。例如,Int32 类包装int数据类型,并且 Double类包装了双重数据 类型

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

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


在.NET中,术语如下:

基元类型是已设置为true的类型。基本类型包括:

基本类型为布尔型、字节型、, SByte、Int16、UInt16、Int32、UInt32、, Int64、UInt64、IntPtr、UIntPtr、Char、, 双人房和单人房

所有基元类型都是值类型,但不是值类型,反之亦然

值类型是。通过值(而不是其引用)传递时,将复制整个值。值类型的局部变量存储在堆栈上
struct
s和
enum
s是值类型


如上所述,所有基元类型都是值类型。它们是
System
命名空间中的
struct
s。在C#、
int
double
等中,关键字基本上是那些
struct
s的别名。

第一个要点是正确的

第二个不是:在.NET中是布尔值、字节、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、UInt64、IntPtr、uintpttr、Char、Double和Single。结构通常不能设置为
null
,但也有可为null的值类型(
null
)。这些仍然是值类型,但是在C中有一个语法糖,将“null”等同于“类型的null值”,这对于可为null的值类型是一个实例,其中
HasValue
返回false

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

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


有关引用类型和值类型的更多信息,请参见。

@Jon编辑了问题并删除了第二个项目符号,而是指向您的答案。