【问题标题】:Definitions of "primitive", "value type", "struct", "class", "wrap" in Java and C#Java和C#中“原始”、“值类型”、“结构”、“类”、“包装”的定义
【发布时间】:2009-10-21 09:05:36
【问题描述】:

我一直试图了解 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#)

【问题讨论】:

    标签: c# java struct primitive value-type


    【解决方案1】:

    第一个要点是正确的。

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

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

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

    有关引用类型和值类型的更多信息,请参阅my article about it

    【讨论】:

    • @Jon 编辑了问题并删除了第二个要点,而是指出了您的答案。
    【解决方案2】:

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

    对于 Java 中的每种原始数据类型, 核心类库提供了一个 将其表示为的包装类 Java 对象。例如,Int32 类包装 int 数据类型,并且 双类包装双数据 输入。

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

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


    .NET 中的术语如下:

    原始类型是一种将IsPrimitive property 设置为true 的类型。原始类型是:

    基本类型有布尔、字节、 SByte,Int16,UInt16,Int32,UInt32, Int64,UInt64,IntPtr,UIntPtr,字符, 双和单。

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

    值类型type that has value semantics, as opposed to reference semantics。当按值(而不是其引用)传递时,将复制整个值。值类型的局部变量存储在堆栈中。 structs 和 enums 是值类型。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2021-09-11
      • 2010-12-06
      • 2011-03-23
      相关资源
      最近更新 更多