如
該 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
}
}