应该是不言自明的,但这是在实时XNA代码的上下文中,我想避免分配,以避免触发GC。因此,我想知道与已加载的类型相关联的托管类型对象是否始终存在于运行时中,或者typeof()是否实际上在堆上构造了一个新的Type对象(可能来自运行时中的一些非托管元数据),这将被垃圾收集。即使问这个问题,也可以指出任何无知的假设/误解=)
来自c# 4规范第7.6.11节:
对于任何给定类型,只有一个
System.Type
对象。这意味着对于类型T
,typeof(T) == typeof(T)
总是为真。
(此外,如果您通过反射获得类型,它也将始终获取相同的Type
对象,但这不在规范中。)
不,类型是缓存的,它总是返回相同的静态只读实例。
您可以编写这个示例测试程序来验证:)
static void MyTest()
{
if (object.ReferenceEquals(typeof(int), typeof(int))
Console.WriteLine("Yippie! they are the same!");
else
Console.WriteLine("WTF?");
}
同样适用于GetType方法和所有其他反射函数,如获取属性、方法、字段、属性和其他所有内容。