我知道在Heap中创建对象时,它们还有两个以上的字段:
所以我想知道何时在堆内存中创建Type Object以及它拥有什么样的数据?它只代表Type?
的元数据我无法找到关于此的更多细节。
答案 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 Fundamentals和MethodTable的部分。
答案 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();