参考值的"类型"存储在内存中?

pen*_*ake 3 .net c# vb.net memory reference

由于参考值作为数据存储在堆中; 哪里存储了任何参考值的类型信息?

如果有几个类艺术家的实例; 当它们存储在堆中时,.Net如何将这些内存块标记为Artist的类型?

谢谢!

Che*_*hen 5

void M()
{
   Artist a = new Artist();
}
Run Code Online (Sandbox Code Playgroud)

调用该方法时,会扩展一个新的堆栈帧,CLR 在执行该方法的第一个语句之前会有一些准备代码,就像一个现象.在此期间,CLR加载方法中使用的所有类型.在此示例中,类型Artist将加载到堆.但是类型也可能已存在,因为在M()调用之前使用了类型.然后我们来到第一个表达式,一个new语句,它调用类的构造函数.如果你看看它产生的CIL,你会看到类似newobjblabla的东西.这里堆上的内存块被分配用于存储实例.块的大小取决于类的详细信息,因为块需要保存实例的所有数据.通常该块由以下组成:

Type pointer + Sync root + Instance data
Run Code Online (Sandbox Code Playgroud)

类型的指针指向其在堆上类型(在加载绪论).同步根是锁定和同步的记录.实例数据存储成员的实例数据.