在C#中,反射始终以:
开头myInstance.GetType();
或者:
typeof(MyType);
要获取Type
,然后在查询有关类型的信息时,例如得到属性,字段,属性等,他们肯定在进行反思。
然而以上的电话反映了自己?
我认为在学术意义上答案是肯定的 - 因为你正在反思这种类型。所以我对问题的第二部分是:它是在运行时进行评估并且它是否第一次执行堆分配?(我知道对同一类型的GetType()
的后续调用返回相同的Type
实例,所以.NET必须缓存结果 - 但它是否必须在第一次调用时构造一个新的Type?或者这是在编译时执行的?
答案 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
对象。