在C#中,反射总是以以下内容开头:
myInstance.GetType();
或:
typeof(MyType);
为了获取Type
,那么当查询有关类型的信息时,例如获取属性,字段,属性等,他们肯定在执行反射。
然而,上述调用是否反映了自己?
我想在学术意义上的答案是肯定的——因为你正在反思类型。所以我对这个问题的第二部分是:它是否在运行时进行评估,它是否第一次执行堆分配? (我知道对同一类型的GetType()
的后续调用会返回相同的Type
实例,因此 .NET 必须缓存结果 - 但它是否必须在第一次调用时构造一个新类型?或者这个东西是在编译时执行的?
myInstance.GetType()
或typeof(MyType)
返回的对象是托管堆上的对象。因此,在运行时的某个时刻,必须进行分配。编译器显然无法执行托管堆分配。(这与 C/C++ 等"函数"(如 sizeof
(相反,编译器会替换一个值,导致根本没有运行时开销。
因此,由此可以得出结论,Type
对象要么是在加载程序集时创建的,要么是在首次调用 myInstance.GetType()
或 typeof(MyType)
等方法时"按需"创建的。
这是哪一个?据我所知,没有具体说明,所以很难说。 例如,GetType()
是在运行时本身中实现的:
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Type GetType();
无论哪种方式,在某些时候,都必须有(非常小的(运行时开销,即为托管堆上的MyType
分配Type
对象。