日期:2014-05-17  浏览次数:20802 次

CLR VIA C# 中关于实例对象中实例字段的问题
本帖最后由 sevenlee4125 于 2013-08-28 17:17:54 编辑
问题: 
  public class BaseClass
    {
        private string name;
        public BaseClass(string n)
        {
            name = n;
        }
        public void Print()
        {
            Console.WriteLine("BaseClass name is" + name);
        }
    }
    public class DirClass : BaseClass
    {
        public DirClass() : base("hello") { }
    }


   
 DirClass d=new DirClass();
    d.Print();

    
    CLR在运行到时会首先在堆上建立相关的类型对象,即BaseClass和DirClass类型本身(如果类型对象不存在的情况)
    其中类型对象包括 类型对象指针、同步块索引、静态字段、方法表(此处BaseClass的方法表中只有Print一个方法)

    运行至DirClass d=new DirClass() 时,会实例一个DirClass对象,一个实例对象包括:类型对象指针、同步块索引,和实例字段
    CLR VIA C# 书上讲在实例前会计算要分配的内存,原话是这样的“它计算类型及其所有基类型(一直到System.Object)中定义的所有实例字段需要的字节数”
    那么在DirClass d=new DirClass()实例完后,d对应的堆上的对象中的实例字段是不是就包括了name字段,并且初始成 "hello"?
    还是由于在实例DirClass的过程中要调用基类的构造函数而在堆上又实例了一个BaseClass对象,d对应堆上中的实例段为空,name这个实例字段在基类对象的实例字段中呢?
如图:
CLR 类型指针对象

------解决方案--------------------
包含
-----------
------解决方案--------------------
内存中保存的是实例,而不是类。其中包括本实例应该有的所有公有和私有的属性。值类型会根据对应类型分配存储空间,引用类型会分配一个空指针。