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