【问题标题】:.NET primitives seem half in the value world and half in the reference world.NET 原语似乎一半在价值世界中,一半在参考世界中
【发布时间】:2011-10-24 16:20:15
【问题描述】:

如果值类型是对象(我已经看到 ValueType 确实继承自 Object),为什么它们不表现为对象?它们不能为空,因此它们似乎没有参考,并且它们必须被装箱/拆箱。当作为参数传递时,它们的行为类似于原语,但由于您可以在它们上调用方法,它们似乎也表现为引用类型。我读到它们通常分配在堆栈上,这使它们再次看起来像值类型。就装箱而言,我没有看到 int 和 Integer 的 Java 等价物,只有 Int32 结构,所以如果 Int32 被装箱,它被装箱到什么中?

简而言之,如果有人能解决他们似乎站在一个世界的一半,另一个世界的一半,我当然会很感激。

【问题讨论】:

  • 您需要重新调整您的期望。你似乎相信如果某物是一个对象,它一定是可以为空的。这是你的问题。一个对象没有理由必须可以为空。
  • 为什么你认为应该有一个等价于Java的int和Integer?这可能是 Java 语言最愚蠢的设计决策之一!

标签: .net value-type reference-type


【解决方案1】:

.NET 允许您将值类型视为对象,因为拥有一个用于操作信息的统一接口是有益的(请参阅 Eiffel 中的 uniform access principle,它影响了 C# 的设计)。 5.ToString()Int32.ToString(5) 更有意义,因为它符合 OOP 范式,即使它只是语法糖。

C# 2.0 及更高版本中的值类型变量可以使用以下语法声明为可为空:

int? myInt;

有关值类型如何工作的更多详细信息,请访问http://msdn.microsoft.com/en-us/library/system.valuetype%28v=VS.85%29.aspx

如果值类型必须表现得像对象,则在堆上分配一个使值类型看起来像引用对象的包装器,并将值类型的值复制到其中。包装器被标记,以便系统知道它包含一个值类型。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2011-02-15
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多