C#中的typeof()运算符是否在堆上分配新的Type对象,还是返回现有的?

时间:2011-10-21 22:42:16

标签: c# reflection garbage-collection xna typeof

应该是非常明显的,但这是在实时XNA代码的上下文中,我想避免分配,以避免触发GC。所以我想知道与已加载的类型相关联的托管类型对象是否始终存在于运行时中,或者如果typeof()实际构造了堆上的新Type对象(可能来自运行时中的某些非托管元数据),这将是垃圾收集。随意指出甚至提出这个问题所揭示的任何无知的假设/误解=)

2 个答案:

答案 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对象,但这不在规范中。)