【发布时间】:2013-05-12 21:06:34
【问题描述】:
显然反射是一个非常广泛的主题,但让我们举一个简单的例子:“is”运算符(A 是 B)。它实际上需要 CLR 做什么?要查看程序集的元数据,请找到类型 A,遍历其继承层次结构并查看 B 是否在其中。
现在,这不是 CLR 的所有标准工作吗?我的意思是,CLR 在运行时一直在非反射代码中进行类型检查。每当您调用方法或为参数赋值时,CLR 必须在运行时检查所分配对象的类型是否与其指定的参数或变量匹配。
那么是什么让反射(我指的是简单的运算符,例如“is”或“as”)相对昂贵?
【问题讨论】:
-
有编译时和运行时检查,反射涉及运行时检查。
-
“每当你调用方法或为参数赋值时,CLR 必须在运行时检查分配对象的类型是否与其指定的参数或变量匹配。” 这些检查是在编译时完成。在运行时,编译的代码在这方面大多被认为是正确的(如果不是这样,你会得到不同的错误)。
-
另外:是什么让你相信
is和as很贵? -
您显然已经意识到这一点,但是反射(至少使用大写的 R)通常意味着不仅仅是简单的类型检查。
is并不那么昂贵。在正常情况下,它不应该有很大的不同。但如果你广泛使用is(和as),你可能有一个更紧迫的问题需要解决:多态性出错了。 -
@OP 是的,您的错误在于认为类型检查是在运行时完成的。除了强制转换和显式反射之外。