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

Max*_*ini 9 c# reflection xna garbage-collection typeof

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

Sal*_*iti 18

不,类型被缓存,它总是返回相同的静态只读实例.

您可以编写此示例测试程序来验证这一点:)

static void MyTest()
{
    if (object.ReferenceEquals(typeof(int), typeof(int))
        Console.WriteLine("Yippie! they are the same!");
    else
        Console.WriteLine("WTF?");
}
Run Code Online (Sandbox Code Playgroud)

这同样适用于GetType方法和其他所有反射函数,例如获取属性,方法,字段,属性和其他所有内容.

  • 这并没有表明它始终是这样的.您可以在Java中使用相同类型的测试来证明自动装箱始终返回相同的数字 - 这一点确实如此,但保证特定范围.或者这可能只是当前的实施,未来会发生变化......我总是更喜欢规范的保证. (2认同)

Jon*_*eet 18

从C#4规范部分7.6.11:

System.Type任何给定类型只有一个对象.这意味着对于一个类型T,typeof(T) == typeof(T)总是如此.

(另外,如果你通过反射获得类型,它总是会获取相同的Type对象,但这不在规范中.)