8

我知道当在堆中创建对象时,它们还有另外两个字段:

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

所以我想知道什么时候在堆内存中创建类型对象,它保存什么样的数据?它只代表Type的元数据?

我一直无法找到有关此的详细信息。

4

2 回答 2

10

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

如果方法已至少执行一次,则方法表中的每个条目都指向 JIT 编译的本机代码。

类型对象是在第一次实例化类型或第一次引用静态类型成员时创建的。

如果您想深入了解 CLR 的功能,我强烈建议您购买 Jeffrey Richter 的书,CLR via C# 。第 4 章中标题为“运行时事物如何关联”的部分详细介绍了堆上的 .NET 类型分配过程。

2005年5 月版的 MSDN 杂志有一篇题为“ JIT 和运行:深入了解 .NET Framework 内部结构以了解 CLR 如何创建运行时对象”的文章,其中包含一些很好的信息,特别是关于类型基础MethodTable的部分。

于 2012-04-17T02:04:13.910 回答
0

所有转换异常、类型匹配和不匹配都由 CLRType 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不知不觉中使用了那种类型。

对应于您的应用程序使用的每种类型(准确地说是 AppDomain)Type Object,堆中的单个实例被引用用于所有此类目的。有关更多详细信息和内部信息 - 通过 C# 第四版从 CLR 引用 Jeffrey Richter:

Type 对象表示作为轻量级对象的类型引用。如果您想了解更多关于类型本身的信息,那么您必须获取一个 TypeInfo 对象,该对象表示一个类型定义。您可以通过调用 System.Reflection.IntrospectionExtensions 的 GetTypeInfo 扩展方法将 Type 对象转换为 TypeInfo 对象。

Type typeReference = ...; // For example: o.GetType() or typeof(Object) 
TypeInfo typeDefinition = typeReference.GetTypeInfo();
于 2016-09-13T06:02:18.120 回答