如果值类型是对象(我已经看到ValueType确实从Object继承)为什么它们不像对象那样?它们不能为null,因此看起来它们没有引用,它们必须装箱/取消装箱。当作为params传递时,它们的行为类似于原语,但由于您可以在它们上调用方法,因此它们似乎也表现为引用类型。我读到它们通常被分配在堆栈上,这使它们看起来像值类型。就拳击问题而言,我没有看到java等价的int和Integer,只是Int32结构,所以如果一个Int32是盒装的,它装入什么?
简而言之,如果有人能够解决他们似乎在一个世界中占据一半而在另一个世界中的一半,我当然会欣赏它。
答案 0 :(得分:1)
答案 1 :(得分: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:
如果值类型的行为必须像对象一样,则在堆上分配使值类型看起来像引用对象的包装器,并将值类型的值复制到其中。标记包装器,以便系统知道它包含值类型。