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
    }

}