关于价值类型的困惑

wah*_*eed 3 .net c#

如果我声明一个Object类的实例,我对一点感到困惑.这将在堆上保留,但是当我声明,这从System.ValueType派生的任何原语类型的实例是从对象类进一步衍生,然后由对象类所使用的它的部分也保留在堆栈中.

为什么会这样,或者Object类不占用空间?

Eri*_*ert 6

你的推理似乎是这样的:

  • System.Int32派生自System.Object
  • 派生类型总是以与其基本类型相同的方式在内存中布局
  • 因此,System.Int32在内存中与System.Object相同

是?

第二个前提是错误的.派生和内存布局几乎没有任何关系.你认为这个前提是真的吗?如果是这样,是什么导致你相信它?

更新:我认为描述一个值类型的方法调用是如何工作的将是有帮助的.

假设您有一个值类型:

struct S { 
    public int x; 
    public override string ToString() { return "Hello!" + x; } 
}
...
S s = new S();
s.x = 0x00112233;
s.ToString();
Run Code Online (Sandbox Code Playgroud)

我们生成什么代码?代码执行此操作:

  • 为sx保留堆栈上的四个字节
  • 将字节00 11 22 33写入该存储器.
  • 调用方法S.ToString,将引用传递给我们刚刚在堆栈上分配的内存位置.

为什么我们需要在堆栈上存储除sx的四个字节以外的任何东西?我们已经拥有了我们需要的所有内容来执行调用:对包含S实例的变量的引用,以及我们正在调用的确切方法实现的确切名称和位置.无需在任何地方存储与System.Object有关的任何内容.没有"对象类使用它的一部分"; 我们不需要这样的东西,所以没有任何这样的东西.