1. 程式人生 > >c# as與is的區別

c# as與is的區別

ace -c bject clr 類型 back 常用 luci 再次

在c#語言中關於類型的判斷與轉換有is和as這2種操作符,具體用法如下:

is檢查一個對象是否兼任與指定的類型,並返回一個Boolean值:true或false,主要,is操作符永遠不會拋出異常,一下代碼進行了演示:

            object o = new object();
            Boolean b1=(o is object);    //b1為true
            Boolean b2 = (o is Boolean); //b1為false

如果對象引用是Null,is操作符總是返回false,因為沒有可檢查其類型的對象。

is操作符同城像下面這樣使用

if(o is Emplyoee){
   Employee e(Employee) o;  在if語句剩余的部分中使用e
}

在這段代碼中,ClR實際回檢查兩次對象的類型。is操作符首先核實o是否兼任與Employee類型,如果是,那麽在if語句內部執行轉換時,CLR再次核實o是否引用一個Employee。CLR的類型檢查增強了安全性,當無疑也會對性能造成一定的影響。這是因為CLR首先必須判斷變量(o)引用的對象的實際類型,然後,CLR必須遍歷繼承層次的結構,用每個基類型去核對指定的類型,由於這是一個相當常用的編程模式,所以c#專門提供了as操作符,目的就是簡化這種代碼的寫法,同時提升其性能。

Employee e=o as Employee
if(e !=null){
    //在if語句中使用e
}

這段代碼中,CLR核實o是否兼任與Employee類型,如果是,as回返回對同一個對象的一個非null引用,如果O不兼任與Employee類型,as操作符回返回Null,註意,as操作符造成CLR只校驗一次對象的類型,if語句只檢查e是否為null,這個檢查的速度比校驗對象的類型快得多。

as操作符的工作方式與強類型轉換一樣,只是它永遠不會拋出一個異常——相反,如果對象不能轉型,結果就是null,所以,正確的做法是檢查最終生成的引用是否為null

參考:《CLR.via c#》

c# as與is的區別