C# 转换性能影响

标签 c#

在 C# 中使用“as”关键字进行转换失败时,将返回 null。后台发生了什么?它是否只是抑制异常,这样我就不必为故障编写处理代码?

与包裹在 try-catch 中的典型 Actor 相比,我对它的性能特征感兴趣。

最佳答案

它正在使用 IL 指令 isinst执行转换而不是 castclass类型转换时使用的指令。这是一条特殊指令,如果有效则执行转换,否则将 null 留在堆栈中。所以不,它不只是抑制异常,而且比这样做快几个数量级。

请注意,isinst 指令和 castclass 指令之间存在一些行为差异 - 主要差异是 isinst 未考虑用户定义的转换运算符,它只考虑直接继承层次结构,例如如果您定义以下两个没有继承层次但有显式转换运算符的类:

class A
{
    public int Foo;
}

class B
{
    public int Foo;

    public static explicit operator B(A a)
    {
        return new B { Foo = a.Foo };
    }
}

那么下面会成功:

var a = new A { Foo = 3 };
var b = (B)a;
Console.WriteLine(b.Foo); // prints 3

但是以下代码无法编译,并出现错误“无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型‘A’转换为‘B’”

var a = new A { Foo = 3 };
var b = a as B;

因此,如果您确实设置了任何用户定义的类型转换(出于这个原因和其他原因,这对于引用类型通常不是一个好主意),那么您应该意识到这种差异。

关于C# 转换性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/361307/

相关文章:

c# - 向继承类添加数据注释

c# - HasMorePages 不工作。设置该位会导致在同一页上打印所有项目

c# - 保存时使控制无效

c# - 用于从 .NET Core 应用程序调用 WCF 服务发送 cookie 的中间件

c# - EnvDTE 遍历解决方案中的子文件夹

c# - 在数据库中存储/检索 JSON 字符串,使其易于在代码中使用

c# - ReSharper "Cannot resolve symbol"即使在项目构建时

c# - 从桌面而不是表单获取鼠标位置

c# - C# 5.0 中的捕获闭包(循环变量)

c# - LINQ to SQL (NHibernate) : OrderBy vs OrderByDescending abstraction