"obj所引用的实例中的变量x是存在于哪里的呢?"
on the managed heap

解决方案 »

  1.   

    obj引用的实例中的变量x是放在受管制的堆中!
    关于这一点你可以详细查看<<C#高级编程>>的第三章!
    该书到处都有下载!
      

  2.   

    我来简单的探讨一下: 我说原理,最后你自己考虑考虑你的问题.
    首先,你的例子有一个语法看起来不太舒服,
    j obj;obj = new j;
    改为j obj;obj = new j(),我们的csc会更高兴些.首先,win32的管理内存空间是4GB,这4GB的空间称虚拟地址空间,简称虚拟内存,无论堆(heap)还是栈(stack),都在这里面.而我们的计算机一般没有这么大的内存,也不大可能用这么多的内存. 所以给他们做了一下划分,有一部分性能高的化出来,叫栈(stack),令一块叫堆(heap),性能低,但是能装的东西多.说说值类型是如何放在栈(stack)的.
    int i; double d; 计算机会在栈顶开辟4个存储单元,放i(不如是100-103,当然,绝对不是100,仅仅比如,后面都这样),然后有拿了8个来放d;说说引用行的如何放在堆(heap)中的.
    比如 
    class Class MyClass
    {
       int i;
       double d;
    }
    MyClass myObj = new MyClass()
    首先,windows要计算这个对象要占用的长度,比如,一个int 4 个字节,一个double要8个字节,还有一个要放这个对象多长,(一般是以32字节为最小分配单位),然后分配了一个32个字节的连续字节,比如是以1000开头.来放这个对象的内容. 虽然内容放好了,但是别人并不知道他在那儿,于是就要到栈(stack)上去,开4个字节(比如从160开始),来放这个100(堆(heap)的开始地址).以后有人使用myObj时候,先找160,然后找1000,就找到里面的内容了.由于的堆(heap)还是栈(stack)原理和速度不同,所以才有了不同的存储方式.比如栈(stack)后来的先走,要想回收前面声明的变量,必须要先回收后面声明的. 要是所有的东西都放在栈里,恐怕不一会就占满了栈的空间. 而堆(heap)就没有这个限制,随时可以回收不用的东西,大不了你的堆(heap)的开始地址先放在栈中.