在C#中,反射始终以:
myInstance.GetType();
Run Code Online (Sandbox Code Playgroud)
要么:
typeof(MyType);
Run Code Online (Sandbox Code Playgroud)
为了获得Type,然后当查询有关类型的信息,例如获取属性,字段,属性等时,它们肯定会执行反射.
但是上面的调用反映了自己吗?
我认为在学术意义上答案是肯定的 - 因为你正在反思这种类型.所以我对这个问题的第二部分是:它是在运行时进行评估,是否第一次执行堆分配?(我知道GetType()对同一类型的后续调用返回相同的Type实例,因此.NET必须缓存结果 - 但它是否必须在第一次调用它时构造一个新类型?或者这个在编译时执行?
托管堆返回的对象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