做為C#里的類型轉(zhuǎn)換操作符,is和as都是強(qiáng)制類型轉(zhuǎn)換梦鉴。
Difference
- is 類型檢查揭保,檢查一個(gè)對(duì)象是否兼容于制定類型,并且返回一個(gè)布爾值存筏。如果對(duì)象引用是null,is操作符總是返回false,因?yàn)闆](méi)有可檢查的其類型的對(duì)象味榛。is操作符永遠(yuǎn)不會(huì)拋出異常
- as 安全的顯示類型轉(zhuǎn)換,僅支持引用類型不支持值類型搏色。永遠(yuǎn)不會(huì)拋出異常,如果轉(zhuǎn)換失敗返回null垂涯。簡(jiǎn)化代碼航邢,提升性能。
Example
ClassA{
...
}
//is 操作符使用:
Object obj = new Object();
Boolean b = obj is ClassA;
if(b)
{
ClassA a = (ClassA) obj;
...
}
在上訴代碼中膳殷,CLR(Common Language Runtime)實(shí)際會(huì)檢查兩次
對(duì)象類型。is操作符首先核實(shí)obj是否兼容于ClassA 類型册招。如果是考榨,那么在if語(yǔ)句內(nèi)部執(zhí)行類型轉(zhuǎn)換時(shí),CLR再次核實(shí)obj是否引用一個(gè)ClassA河质。CLR的類型檢查增強(qiáng)了安全性,但也會(huì)對(duì)性能造成一定的影響散休。這是因?yàn)镃LR首先必須判斷(obj)引用的對(duì)象的實(shí)際類型乐尊。然后CLR必須遍歷繼承層次結(jié)構(gòu),用每個(gè)基類型去核對(duì)指定的類型(ClassA)。
//as 操作符使用:
Object obj=new Object();
ClassA a= obj as ClassA;
if(a!=null)
{
...
}
在上訴代碼中夺颤,CLR核實(shí)obj是否兼容于ClassA類型胁勺,如果是,as會(huì)返回對(duì)同一個(gè)對(duì)象的一個(gè)非null引用署穗。如果obj不兼容ClassA類型,as操作符會(huì)返回null封恰。
因此褐啡,as操作符使CLR只檢驗(yàn)一次
對(duì)象的類型。
if語(yǔ)句只是檢查a是否為null备畦。這個(gè)檢查的速度比檢驗(yàn)對(duì)象的類型快得多。所以正確做法是檢查最終生成的引用是否為null逸嘀。如果企圖直接使用最終生成null的引用允粤,會(huì)拋出一個(gè) NullReferenceException異常。
Summary
用is操作符時(shí)需要先判斷為true再去轉(zhuǎn)換类垫,而as直接強(qiáng)制轉(zhuǎn)換,簡(jiǎn)化代碼残家,同時(shí)提高性能售躁。
故而類型轉(zhuǎn)換時(shí)優(yōu)先選用as,當(dāng)只需要判斷true/false然后進(jìn)行不同邏輯操作時(shí)采用is