在运行时性能方面更好的是:显式强制转换或'如'/'是语法

本文关键字:转换 语法 方面 性能 运行时 更好 | 更新日期: 2023-09-27 18:02:02

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

// explicit casting
var castedObj = (ICar)originalObj;
// 'as' casting
var obj2 = originalObj as ICar;

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

我说的对吗?

在运行时性能方面更好的是:显式强制转换或'如'/'是语法

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

  • 如果你知道它是一个ICar,使用cast

  • 如果你不知道,使用"as"并测试结果是否为null

你为什么不自己分析一下呢?

需要考虑的一件重要的事情是,在你的第一个实例中,如果它不是一个ICar,它将抛出异常。你可以把它包装在try/catch块中并处理异常,但如果originalobj不是ICar,使用'as'关键字可能会更快,它会将null赋值给obj2,然后你可以简单地做一个null检查,而不是依赖于计算成本更高的异常处理。

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

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

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

(如果编译器在编译时知道类型,它将优化丢弃,但它也将优化as。此外,如果强制转换失败,它将生成一个异常,这确实很慢,但如果您希望强制转换总是成功,则不重要。

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

castclass string

对于as:

isinst string

请参阅下面的博客文章,有人做了一些详细的计时(并发现isinst稍微快一些,但不是你关心的任何数量):

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