GetType()和typeof()是否构成反射?

时间:2014-06-24 01:07:48

标签: c# .net

在C#中,反射始终以:

开头
myInstance.GetType();

或者:

typeof(MyType);

要获取Type,然后在查询有关类型的信息时,例如得到属性,字段,属性等,他们肯定在进行反思。

然而以上的电话反映了自己?

我认为在学术意义上答案是肯定的 - 因为你正在反思这种类型。所以我对问题的第二部分是:它是在运行时进行评估并且它是否第一次执行堆分配?(我知道对同一类型的GetType()的后续调用返回相同的Type实例,所以.NET必须缓存结果 - 但它是否必须在第一次调用时构造一个新的Type?或者这是在编译时执行的?

1 个答案:

答案 0 :(得分:6)

myInstance.GetType()typeof(MyType)返回的对象是托管堆上的对象。因此,在 runtime 的某个时刻,必须进行分配。编译器显然无法进行托管堆分配。 (这与C / C ++'和sizeof类似,其中一个值被编译器替换,导致根本没有运行时开销。)

因此,您可以得出结论,Type对象要么是在装配点加载时创建的,要么是按需创建的[&创建]对象。当您第一次调用myInstance.GetType()typeof(MyType)等方法时。

这是哪一个?据我所知,它没有具体说明,所以很难说。例如,GetType()在运行时本身中实现:

[MethodImpl(MethodImplOptions.InternalCall)]
public extern Type GetType();

无论哪种方式,在某些时候都必须存在(极小的)运行时开销,即在托管堆上为Type分配MyType对象。