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这个实例字段在基类对象的实例字段中呢?
如图:
------解决方案--------------------包含
-----------
------解决方案--------------------内存中保存的是实例,而不是类。其中包括本实例应该有的所有公有和私有的属性。值类型会根据对应类型分配存储空间,引用类型会分配一个空指针。