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

mar*_*mnl 5 .net c#

在C#中,反射始终以:

myInstance.GetType();
Run Code Online (Sandbox Code Playgroud)

要么:

typeof(MyType);
Run Code Online (Sandbox Code Playgroud)

为了获得Type,然后当查询有关类型的信息,例如获取属性,字段,属性等时,它们肯定会执行反射.

但是上面的调用反映了自己吗?

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

Bal*_*ick 6

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

因此,您可以得出结论,Type对象要么是在加载程序集时创建的,myInstance.GetType()要么typeof(MyType)是在第一次调用类似的方法时"按需"创建的.

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

[MethodImpl(MethodImplOptions.InternalCall)]
public extern Type GetType();
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,在某些时候,必须存在(在托管堆上)分配对象的(非常小的)运行时开销.TypeMyType