1. 程式人生 > >C#中as是什麼含義?is是什麼含義? is與as運算子

C#中as是什麼含義?is是什麼含義? is與as運算子

is與as運算子
Is:檢查物件是否與給定的型別相容。例如,下面的程式碼可以確定MyObject型別的一個例項,或者物件是否從MyObject派生的一個型別:

       if(obj is MyObject){}

    如果所提供的表示式非空,並且所提供的物件可以強制轉換為所提供的型別而不會導致引發異常,則 is 表示式的計算結果將是 true。

    如果已知表示式始終是true或始終是false,則is關鍵字將導致編譯時警告,但是通常在執行時才計算型別相容性。

    注意:is執行符不能過載,is執行符只考慮引用轉換、裝箱轉換和取消裝箱轉換。不考慮其它轉換,如果使用者定義轉換。在Is運算子的左側不允許使用匿名方法。lambda表示式屬於例外。

Object myObject = new Object(); 
     Boolean b1 = (myObject is Object);      true.  
     Boolean b2 = (myObject is Employee);    false.
     如果物件引用是null,is運算子總是返回false,因為沒有可檢查其型別的物件。

is運算子通常像下面這樣使用:

    if (myObject is Employee)

     {

           Employee myEmployee = (Employee)myObject;

     }

    在這段程式碼中,CLR實際會檢查兩次物件的型別。is運算子首先核實myObject是否兼容於Employee型別。如果是,那麼在if語句內部執行轉換型,CLR會再次核實myObject是否引用一個Employee。CLR的型別檢查增加了安全性,但這樣對效能造成一定影響。這是因為CLR首先必須判斷變數(myObject)引用的物件的實際型別。然後,CLR必須遍歷繼承層次結構,用每個基型別去核對指定的型別(Employee)。由於這是一個相當常用的程式設計模式,所以C#專門提供了as運算子,目的就是簡化這種程式碼寫法,同時提升效能。

as:用於檢查在相容的引用型別之間執行某些型別的轉換。

    Employee myEmployee = myObject as Employee;

    if (myEmployee != null)

    { }

    在這段程式碼中,CLR核實myObject是否兼容於Employee型別;如果是,as會返回對同一個物件的一個非null

     的引用。如果myObject不兼容於Employee型別,as運算子會返回null。

    注意:as運算子造成CLR只校驗一次物件的型別。if語句只是檢查myEmployee是否為null。這個檢查的速度比校驗物件的型別快得多。

as運算子的工作方式與強制型別轉換一樣,只是它永遠不會丟擲一個異常。相反,如果物件不能轉換,結果就是null。所以,正確的做法是檢查最終生成的一引用是否為null。如果企圖直接使用最終生成的引用,會丟擲一個System.NullReferenceException異常。以下程式碼對此進行了演示:

    Object o = new Object();        新建一個Object物件。

    Employee e = o as Employee;     將o轉型為一個Employee

    e.ToString();                   訪問e會丟擲一個NullReferenceException異常

    備註:

    as運算子類似於強制轉換操作。但是無法進行轉換,則as返回null而非引發異常。

    示例:

    expression as Type它等效於以下表達式,但是隻計算一次expression。

    expression is Type ?(Type)expression : (Type)null

    注意:as運算子只執行引用轉換和裝箱轉換。as運算子無法執行其它轉換,如果使用者定義的轉換,這類轉換應使用強制轉換表示式來執行。