C# 在运行时性能方面,什么更好:显式强制转换或“as”/“是语法

C# 在运行时性能方面,什么更好:显式强制转换或“as”/“是语法,c#,.net,c#-4.0,C#,.net,C# 4.0,执行显式强制转换和使用as/is语法之间有什么区别 // explicit casting var castedObj = (ICar)originalObj; // 'as' casting var obj2 = originalObj as ICar; 我的假设是,在使用as/is创建msil代码时,使用显式强制转换正在进行优化,这需要进行影响性能的运行时检查 我说的对吗?强制转换也需要运行时检查,所以差别很小 as返回null或casted对象,因此分配引用的额外开销可能很小[编辑:但

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

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

// 'as' casting
var obj2 = originalObj as ICar;
我的假设是,在使用as/is创建msil代码时,使用显式强制转换正在进行优化,这需要进行影响性能的运行时检查


我说的对吗?

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

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

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

从技术上讲,对于浇铸而言,所产生的IL用于将对象浇铸到字符串的示例:

对于as:

请参阅下面的博文,其中有人做了一些详细的计时,发现isinst稍微快一点,但与您关心的任何数量无关:


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

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

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

从技术上讲,对于浇铸而言,所产生的IL用于将对象浇铸到字符串的示例:

对于as:

请参阅下面的博文,其中有人做了一些详细的计时,发现isinst稍微快一点,但与您关心的任何数量无关:


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

<> P>一个重要的问题是,在第一个实例中,如果不是ICAR,它将抛出异常。您可以将其包装在一个try/catch块中并处理异常,但是使用'as'关键字可能会更快,因为它会将null分配给obj2。如果originalobj不是一个ICar,那么您可以简单地执行null检查,而不必依赖计算成本更高的异常处理


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

为什么不分析一下,自己看看呢

<> P>一个重要的问题是,在第一个实例中,如果不是ICAR,它将抛出异常。您可以将其包装在一个try/catch块中并处理异常,但是使用'as'关键字可能会更快,因为它会将null分配给obj2。如果originalobj不是一个ICar,那么您可以简单地执行null检查,而不必依赖计算成本更高的异常处理


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

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

如果你知道这是一个ICar,使用石膏

如果您不知道,请使用as并测试结果是否为null


使用任何表达您意图的工具。

性能与您的选择无关:

如果你知道这是一个ICar,使用石膏

如果您不知道,请使用as并测试结果是否为null

使用表达您意图的选项。

在此处阅读此答案在此处阅读此答案
castclass string
isinst string