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