1

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

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

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

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

我对么?

4

3 回答 3

3

性能应该与您的选择无关:

  • 如果您知道它是ICar,请使用演员表。

  • 如果您不知道,请使用“as”并测试结果是否为空。

使用任何表达您的意图。

于 2013-03-03T12:51:25.620 回答
1

强制转换也需要运行时检查,所以差别很小。

返回 null 或强制转换的as对象,因此它可能具有分配引用的微小额外开销 [编辑:但似乎不是;请参阅下面链接的博客]

(如果编译器在编译时知道类型,它将优化转换,但它也会优化as转换。此外,如果转换失败,它会生成一个非常慢的异常,但如果你期望的话并不重要演员总是成功的。)

从技术上讲,对于铸件,产生的 IL 是(例如铸件objectstring):

castclass string

对于一个as

isinst string

请参阅以下博客文章,其中有人做了一些详细的时间安排(并发现这isinst稍微快了一点,但不是你关心的任何数量):

http://m3mia.blogspot.co.uk/2007/11/comparing-isinst-to-castclass.html

于 2013-03-03T12:46:32.270 回答
1

您为什么不对此进行分析并亲自查看?

但是要考虑的重要一点是,在您的第一个实例中,如果它不是 ICar,它将引发异常。您可以将其包装在 try/catch 块中并处理异常,但使用“as”关键字可能会更快,如果 originalobj 不是 ICar,它将为 obj2 分配 null,然后您可以简单地进行 null 检查而不是依赖关于计算成本更高的异常处理。

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

于 2013-03-03T12:48:48.563 回答