在 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/