as 关键字类似于运算符。如果无法进行演员表演,使用 as 会产生 null 而不会产生 InvalidCastException

expression as type 相当于 expression is type ? (type)expression : (type)null,但需要注意的是 as 仅对引用转换,可空转换和装箱转换有效。支持用户定义的转换 ; 必须使用常规演员。

对于上面的扩展,编译器生成代码,使得 expression 仅被评估一次并使用单动态类型检查(与上面示例中的两个不同)。

当期望一个参数来促进几种类型时,as 会很有用。具体来说,它授予用户多个选项 - 而不是在投射之前使用 is 检查每种可能性,或者仅仅是投射和捕获异常。最好的做法是在投射/检查对象时使用’as’,这只会导致一次拆箱惩罚。使用 is 进行检查,然后施放将导致两次拆箱处罚。

如果预期参数是特定类型的实例,则优选常规强制转换,因为其目的对于读者来说更清楚。

因为对 as 的调用可能会产生 null,所以请务必检查结果以避免发生错误。

用法示例

object something = "Hello";
Console.WriteLine(something as string);        //Hello
Console.Writeline(something as Nullable<int>); //null
Console.WriteLine(something as int?);          //null

//This does NOT compile:
//destination type must be a reference type (or a nullable value type)
Console.WriteLine(something as int);

.NET 小提琴现场演示

不使用 as 的等效示例:

Console.WriteLine(something is string ? (string)something : (string)null);

这在覆盖自定义类中的 Equals 函数时很有用。

class MyCustomClass
{

    public override bool Equals(object obj)
    {
        MyCustomClass customObject = obj as MyCustomClass;

        // if it is null it may be really null
        // or it may be of a different type
        if (Object.ReferenceEquals(null, customObject))
        {
            // If it is null then it is not equal to this instance.
            return false;
        }

        // Other equality controls specific to class
    }

}