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



在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对象。

最新更新