什么是堆对象类型(What is Type Object in Heap)

2019-06-23 16:43发布

我知道,在堆对象被创建的时候,他们也有额外的两个字段:

  1. 同步块索引
  2. 类型对象指针

所以,我不知道,当在堆内存中创建对象类型,它拥有什么样的数据? 它不仅代表了类型的元数据?

我一直没能找到有关的细节。

Answer 1:

Type对象还包含背任何静态字段的类型,以及一个方法表,每个类型中定义的方法中的一个条目中的字节。

在方法表指向JIT编译的本地代码的每个条目,如果该方法已被执行至少一次。

类型对象被创建在第一时间的类型实例化或第一次静态型部件被引用。

我强烈建议购买杰弗里里希特的书,副本CLR通过C#如果你想获得的CLR做什么一个非常深刻的理解。 标题为“第4章如何在物联网相关运行”一节涵盖了详细堆中的.NET类型分配过程。

在MSDN杂志2005年5月版有题为“的文章JIT和运行:钻进入.NET框架内部机制来见CLR如何创建运行时对象 ”有一些好的信息为好,特别是对部分类型基本原理和方法表 。



Answer 2:

所有的转换异常,类型匹配和错配完成并通过的帮助下CLR处理Type Object在.net中。 最简单的,创造型的最快方法Type Object是通过typeof操作,如下图所示:

    var fileTypeObjectInHeap = typeof(File);

如果你曾经做过这样的事情在C# -比较对象的类型o与一些已知类型(这里FileInfo ):

var fileName = @"C:\sample.txt";
object o = new FileInfo(fileName);
if (o.GetType() == typeof(FileInfo)) { ... }

那么你已经使用Type Object该类型的浑然不觉。

对应于每一种类型的正在使用的应用程序(应用程序域要准确)有的单个实例Type Object在堆被用于所有这样的目的称为。 欲了解更多的细节和内部 - 通过C#第四版报价从CLR杰弗里里希特:

一类对象表示类型的参考这是一个轻便物体。 如果您想了解更多关于该类型本身,则必须获得所属类别对象,它代表一个类型定义。 你可以通过调用System.Reflection.IntrospectionExtensions' GetTypeInfo的扩展方法转换类型对象的所属类别对象。

Type typeReference = ...; // For example: o.GetType() or typeof(Object) 
TypeInfo typeDefinition = typeReference.GetTypeInfo();


文章来源: What is Type Object in Heap
标签: .net clr heap