如果我写了这段代码:
typeof(myType).TypeHandle
它会用反射吗?
与以下有多大不同:
Type.GetType(string).TypeHandle
是吗?
嗯,这实际上取决于你所说的"反思" - 这并不是严格定义的.
typeof
在编译的代码中使用有两个部分.第一个是ldtoken
在CIL规范中使用的是这样描述的IL指令:
ldtoken指令为指定的元数据标记推送RuntimeHandle.令牌应为以下之一:
methoddef,methodref或methodspec:推送RuntimeMethodHandle
typedef,typeref或typespec:推送RuntimeTypeHandle
fielddef或fieldref:推送RuntimeFieldHandle
推送到堆栈上的值可用于调用系统类库中的反射方法
在此之后,拨打电话Type.GetTypeFromHandle
.
Type.GetType(string)
如果这是您所关注的,那么这一切都要快得多.
编辑:我刚刚注意到你问题的TypeHandle部分.据我所知,MS编译器不会优化对GetTypeFromHandle和TypeHandle的调用,即使我猜你真的只需要ldtoken
调用.
是否所有这些都被视为"反思"取决于你......