111,086
社区成员




我的类型是ConsoleApplication1.B,我的HashCode是45653674。
我的类型是ConsoleApplication1.B,我的HashCode是45653674。
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
new B().我到底是谁呢();
Console.ReadKey();
}
}
class A
{
public virtual void 我到底是谁呢()
{
Console.WriteLine("我的类型是{0},我的HashCode是{1}。", this.GetType().FullName, this.GetHashCode());
}
}
class B: A
{
public override void 我到底是谁呢()
{
base.我到底是谁呢();
Console.WriteLine("我的类型是{0},我的HashCode是{1}。", this.GetType().FullName, this.GetHashCode());
}
}
}
★这种初始化顺序是由内存分配机制决定的,如我们调用MyClass myClass = new MyClass(), 其产生对象如下:
1. 计算该类中定义的所有实例字段的size和两个附加对象(type handler(类对象的指针)和syncBlockIndex(指向一块用来管理对象同步的内存))的size并一直递归到object对象,得到其需要分配内存大小, 看剩余内存是否够分配此对象, 不够会导致垃圾回收.
2. 首先构造MyClass的type对象,type对象包括静态字段和方法表,将其分配在托管堆的loader堆上,注意此对象将不会被GC自动回收, 其生命周期是从创建到AppDomain卸载.
3. 构造MyClass的实例字段,构造附加type handler并指向type对象, 构造SyncBlockIndex并指向同步内存.
4. 调用MyClass构造函数,此时会引起其父类初始化, 父类初始化循环上述过程,直至object对象完成创建, 再返回执行子类构造函数直至MyClass, 创建MyClass完成后, 返回其内存地址, 赋值给MyClass的this,并将其引用传给栈上声明的myClass.