C#铸造性能意义 - 代码日志

C#铸造性能意义

当在C#中使用’as’关键字使一个失败的转换时,返回null。在后台发生了什么?它是否只是抑制异常,所以我不必为失败编写处理代码?

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

使用IL指令isinst执行转换而不是投射时使用的castclass指令。这是一个特殊的指令,如果它有效,则执行cast,否则如果不是,则在堆栈中留空。所以不,它不仅仅是抑制一个异常,而且比这样要快几个数量级。

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

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;

所以如果你确实有任何用户定义的转换(通常是参考类型的一个坏主意,因为这个原因和其他),那么你应该知道这个差异。

http://stackoverflow.com/questions/361307/c-sharp-casting-performance-implications

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C#铸造性能意义