什么是堆中的类型对象

时间:2012-04-17 01:47:06

标签: .net clr heap

我知道在Heap中创建对象时,它们还有两个以上的字段:

  1. 同步阻止索引
  2. 输入对象指针
  3. 所以我想知道何时在堆内存中创建Type Object以及它拥有什么样的数据?它只代表Type?

    的元数据

    我无法找到关于此的更多细节。

2 个答案:

答案 0 :(得分:7)

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

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

第一次实例化类型或第一次引用静态类型成员时,会创建type对象。

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

May 2005 edition of MSDN magazine有一篇标题为“JIT and Run: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects”的文章,其中包含一些很好的信息,特别是关于Type FundamentalsMethodTable的部分。

答案 1 :(得分:0)

所有强制转换异常,类型匹配和不匹配都是由CLR在.Net中Type Object的帮助下完成和处理的。创建类型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对象,该对象表示类型定义。您可以   通过调用将Type对象转换为TypeInfo对象   System.Reflection.IntrospectionExtensions的GetTypeInfo扩展   方法。

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