GetType()和typeof()是否构成reflection?

在C#中,reflection始终以:

myInstance.GetType(); 

要么:

 typeof(MyType); 

要获取Type ,然后当查询有关类型的信息时,例如获取属性,字段,属性等,它们肯定会执行reflection。

不过上面的电话反映了自己吗?

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

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

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

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

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

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