关于运行时性能的更好:显式转换或'as'/'是语法

时间:2013-03-03 12:43:51

标签: c# .net c#-4.0

执行显式转换和使用as / is语法有什么区别?

// explicit casting
var castedObj = (ICar)originalObj;

// 'as' casting
var obj2 = originalObj as ICar;

我的假设是在创建msil代码时正在优化使用显式转换,而使用as / is需要影响性能的运行时检查。

我说错了吗?

3 个答案:

答案 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,然后您可以简单地进行空检查而不是依赖计算成本更高的异常处理。

然而,在今天的机器上,性能差异可以忽略不计。