如
该 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);
不使用 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
}
}