C#在操作類型轉換時,提供了 as 和 is , 顯式,隱式類型轉換,由於顯式和隱式類型轉換比較容易理解,這里主要介紹下 is 和 as 的轉換。
1. is 轉換
is 操作符指定一個對象類型是否兼容於所指定的類型,返回的是 Bollen 值,true 或false, is 操作符永遠不會拋出異常。如果引用的對象是null, is 操作符總是返回false,因為沒有可檢查其類型的對象。
Object o= new Object(); Boolean b1= (o is object); Boolean b2=(o is Employee);
if(o is Employee){ Employee e= (Employee)o; }
在這段if 代碼中,CLR 實際上會檢查兩次對象的類型,is 操作符首先核實o是否兼容於Employee類型,如果是,那么if語句內部執行轉換時,CLR 會再次核實o是否兼容於 Employee 類型,CLR 的類型檢查增強的安全性,但無疑也會對性能造成一定影響,這是因為,CLR 必須首先判斷變量o引用的對象的實際類型,然后CLR 必須遍歷繼承層次結構,用每個基類型去核對指定的類型(Employee),由於這是一種相當常用的編程模式,所以C#專門提供了as 操作符,目的就是簡化這種代碼的寫法,同時提升性能。
2. as 轉換符
as 操作符的工作方式與強制類型轉換一樣 ,只是它永遠不會拋出一個異常,如果對象不能轉換,結果就是null,強制轉換則會拋出異常。以下為示例:
Employee e = o as Employee; if(e !=null){ //要實現的業務邏輯 }
在這段代碼中, CLR 核實o 是否兼容於Employee, 如果是,as 會返回對同一對象的一個非null 引用 ,如果o 不兼容於Employee 類型,as 操作符會返回null,值 得注意的是 as 操作符造成CLR 只校驗一次對象的類型,if語句只是檢查e是否為null, 這樣的檢查速度比校驗對象的類型快的多。