ClassA
{
....
}
Object o=new Object();
Boolean b1=(o is Object); //b1爲true.
Boolean b2=(o is ClassA) ; b2爲false.
【轉載】C#中的is和as操作符
在C#語言中進行類型轉換的操作符is和as。is和as都是強制類型轉換,但這兩者有什麼相同之處和不同之處呢?在使用is和as需要注意哪些事項?下面我們從簡單的代碼示例去探討這個簡單的問題。注:此博文只是本人學習過程中一些簡要記錄,新手可以看一下,高手略過。
is檢查一個對象是否兼容於指定的類型,並返回一個Boolean值:true或者fasle。注意,is操作符永遠不會拋出異常,請看以下示例:
如果對象引用是null,is操作符總是返回false,因爲沒有可檢查的其類型的對象。
is 操作符通常像下面這樣使用:
if(obj is ClassA)
{
ClassA a=(ClassA) obj;
...
}
在這一段代碼中,CLR實際會檢查兩次對象類型。is操作符首先覈實obj是否兼容於ClassA 類型。如果是,那麼在if語句內部執行類型轉換時,CLR再次覈實obj是否引用一個ClassA。CLR的類型檢查增強了安全性,但也會對性能造成一定的影響。這是因爲CLR首先必須判斷(obj)引用的對象的實際類型。然後CLR必須遍歷繼承層次結構,用每個基類型去核對指定的類型(ClassA)。
實際系統開發中,這是一個相當常用的編程模式,於是C#有了操作符as。
但as有其不同的地方,簡化代碼,同時提升性能。
請看示例代碼:
Object obj=new Object();
ClassA a= obj as ClassA;
if(a!=null) //在if判斷a是否爲null
{
...
}
在這一段代碼中,CLR覈實obj是否兼容於ClassA類型,如果是,as會返回對同一個對象的一個非null引用;
如果obj不兼容ClassA類型,as操作符會返回null。
因此,as操作符使CLR只檢驗一次對象的類型。
if語句只是檢查a是否爲null。這個檢查的速度比檢驗對象的類型快得多。
所以正確做法是檢查最終生成的引用是否爲null。如果企圖直接使用最終生成null的引用,會拋出一個 NullReferenceException異常。
示例代碼:
Object obj=new Object(); //創建一個object對象.
ClassA a =obj as ClassA;//將obj轉型爲ClassA,此時轉型操作會失敗,不會拋出異常,但a會被設爲null.
a.ToString();//訪問a會拋出一個NullReferenceException異常。