C#不允许从类派生结构,但所有ValueType都派生自Object.这种区别在哪里?
CLR如何处理这个问题?
我用反射检查内容,System.Int32发现它包含另一个System.Int32.
System.Int32 m_value;
Run Code Online (Sandbox Code Playgroud)
我不明白这是怎么回事.
这int实际上是你所拥有的"后退整数":如果你int打算并使用反射来改变其m_value字段的值,你可以有效地改变整数的值:
object testInt = 4;
Console.WriteLine(testInt); // yields 4
typeof(System.Int32)
.GetField("m_value", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(testInt, 5);
Console.WriteLine(testInt); // yields 5
Run Code Online (Sandbox Code Playgroud)
这个奇点背后必须有一个理性的解释.值类型如何包含自身?CLR用它来制作它有什么神奇之处?
一个天真的类型系统会将对象存储为指向其类型的指针(其中包含许多有用的信息,如vtable,对象大小等),后跟其数据.如果.Net具有这样的类型系统,则object在32位系统上占用4个字节,在64位上占用8个字节.
我们可以看到它没有.对象开销是两个指针大小,另外,还有一个指针大小的"最小"大小.
那么object在幕后实际存储的内容是什么?