Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的typeof()运算符是在堆上分配新的类型对象,还是返回现有的类型对象?_C#_Reflection_Garbage Collection_Xna_Typeof - Fatal编程技术网

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

C#中的typeof()运算符是在堆上分配新的类型对象,还是返回现有的类型对象?,c#,reflection,garbage-collection,xna,typeof,C#,Reflection,Garbage Collection,Xna,Typeof,这应该是不言自明的,但这是在实时XNA代码的上下文中,我希望避免分配以避免触发GC。因此,我想知道与已加载的类型关联的托管类型对象是否始终存在于运行时中,或者typeof()是否在堆上构造了一个新的类型对象(可能来自运行时中的一些非托管元数据),该对象将被垃圾收集。请随时指出任何无知的假设/误解,即使是问这个问题也会暴露出来=)不,类型是缓存的,它总是返回相同的静态只读实例 您可以编写此示例测试程序来验证这一点:) 这同样适用于GetType方法和所有其他反射函数,如获取属性、方法、字段、属性和

这应该是不言自明的,但这是在实时XNA代码的上下文中,我希望避免分配以避免触发GC。因此,我想知道与已加载的类型关联的托管类型对象是否始终存在于运行时中,或者typeof()是否在堆上构造了一个新的类型对象(可能来自运行时中的一些非托管元数据),该对象将被垃圾收集。请随时指出任何无知的假设/误解,即使是问这个问题也会暴露出来=)

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

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

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

来自C#4规范第7.6.11节:

对于任何给定类型,只有一个
System.Type
对象。这意味着对于类型
T
typeof(T)==typeof(T)
始终为真


(此外,如果您通过反射获取类型,它也将始终获取相同的
类型
对象,但这不在规范中。)

谢谢(感谢您和Jon)!我真的应该考虑一下这个测试——我的自私自利的借口是,作为一个函数式编程的维尼,我倾向于认为引用平等是一个丑陋的黑客,所以当它有用时,我并不总是想起它=)@MaxStrini:作为道歉,这是一个精心编造的故事,但这并不意味着它一定会一直如此。您可以使用Java中相同的测试来证明自动装箱总是返回相同的数字——在某种程度上是正确的,但在特定范围内是有保证的。或者这可能只是当前的实现,未来会有变化。。。我总是喜欢从规范中得到保证。这可能永远不会改变,因为它是在编译器和框架本身中构建的。加载部件时,将加载ar类型。我把它作为保修单。语言规范与现实世界不同,语言规范必须尽可能开放,以使其他项目更容易“符合语言:)我还必须说,它已成为事实,是typeof和gettype返回相同实例的事实标准,微软无法更改它,因为它会破坏所有可能的程序(以及它们的框架本身)。奇怪的是,规范会将它表示为
typeof(T)==typeof(T)
,而这可能仅仅意味着
=
操作符过载了!:)是的,确切地说,C#规范使它足够大,可以容纳各种情况。发生这种情况有几个原因。。。可以在自定义类型系统中实现从基本system.Reflection类继承的类型类。然后你可以表现得不同(如果你疯了,真的,真的需要的话)。但是,在框架的标准实现(Mono、.NET compact framework、microsoft.NET framework所有版本、silverlight)中,所有反射方法的行为方式相同,并返回相同的实例。
static void MyTest()
{
    if (object.ReferenceEquals(typeof(int), typeof(int))
        Console.WriteLine("Yippie! they are the same!");
    else
        Console.WriteLine("WTF?");
}