执行显式转换和使用 as/is 语法有什么区别?
// explicit casting
var castedObj = (ICar)originalObj;
// 'as' casting
var obj2 = originalObj as ICar;
我的假设是,在使用 as/is 时创建 msil 代码时正在优化使用显式转换,这需要影响性能的运行时检查。
我对么?
性能应该与您的选择无关:
如果您知道它是ICar
,请使用演员表。
如果您不知道,请使用“as”并测试结果是否为空。
使用任何表达您的意图。
强制转换也需要运行时检查,所以差别很小。
返回 null 或强制转换的as
对象,因此它可能具有分配引用的微小额外开销 [编辑:但似乎不是;请参阅下面链接的博客]
(如果编译器在编译时知道类型,它将优化转换,但它也会优化as
转换。此外,如果转换失败,它会生成一个非常慢的异常,但如果你期望的话并不重要演员总是成功的。)
从技术上讲,对于铸件,产生的 IL 是(例如铸件object
到string
):
castclass string
对于一个as
:
isinst string
请参阅以下博客文章,其中有人做了一些详细的时间安排(并发现这isinst
稍微快了一点,但不是你关心的任何数量):
http://m3mia.blogspot.co.uk/2007/11/comparing-isinst-to-castclass.html
您为什么不对此进行分析并亲自查看?
但是要考虑的重要一点是,在您的第一个实例中,如果它不是 ICar,它将引发异常。您可以将其包装在 try/catch 块中并处理异常,但使用“as”关键字可能会更快,如果 originalobj 不是 ICar,它将为 obj2 分配 null,然后您可以简单地进行 null 检查而不是依赖关于计算成本更高的异常处理。
然而,在今天的机器上,性能上的差异可以忽略不计。