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