C#強(qiáng)制類(lèi)型轉(zhuǎn)化()、is、as應(yīng)用分析
C#強(qiáng)制類(lèi)型轉(zhuǎn)化有以下三種:
注:objA 為 typeA 類(lèi)型,objB 為 typeB 類(lèi)型
(1) typeA objA = (typeA)objB;
(2) typeA objA = objB as objA;
(3) typeA objA = objB as typeA
在實(shí)際開(kāi)發(fā)過(guò)程中我們經(jīng)常用到上面三種類(lèi)型轉(zhuǎn)換,但這三種C#強(qiáng)制類(lèi)型轉(zhuǎn)化的區(qū)別,以及在使用中應(yīng)如何選擇呢?
在我們使用***種類(lèi)型轉(zhuǎn)換時(shí),如果類(lèi)型typeA是typeB的上層類(lèi),則能正確進(jìn)行類(lèi)型轉(zhuǎn)換,如typeB是typeA的上層類(lèi),將會(huì)拋出System.InvalidCastException異常。所以在實(shí)開(kāi)發(fā)中,為了避免異常的發(fā)行,我們可能會(huì)用到如下的代碼:
- If(objB is typeA)
- {
- objA = (typeA)objB;
- }
其中is為第二種類(lèi)型轉(zhuǎn)換,根據(jù)MSDN上的解釋?zhuān)淖饔檬恰皺z查對(duì)象是否與給定類(lèi)型兼容”,盡管它僅是反回一個(gè)boolean類(lèi)型的值,但它也是通過(guò)進(jìn)行類(lèi)型轉(zhuǎn)換來(lái)判斷是否兼容的,所以,在使用此語(yǔ)句的時(shí)候,會(huì)進(jìn)行一次類(lèi)型轉(zhuǎn)換。那么,如果typeB與typeA是相容的話(huà),上述代碼將會(huì)再次進(jìn)行 (typeA)objB的類(lèi)型轉(zhuǎn),肯定會(huì)影響我們所開(kāi)發(fā)程序的性能。那么有沒(méi)有一種更好的辦法來(lái)幫助我們解決這個(gè)問(wèn)題呢?
下面我們來(lái)看一下第三種C#強(qiáng)制類(lèi)型轉(zhuǎn)化。
在進(jìn)行第三種類(lèi)型轉(zhuǎn)換時(shí),如果typeB型的實(shí)例objB無(wú)法轉(zhuǎn)換到typeA類(lèi)型時(shí),就會(huì)反回一個(gè)null值,若轉(zhuǎn)換成功,則返回一個(gè)typeA類(lèi)型的實(shí)例。此種轉(zhuǎn)換不會(huì)發(fā)生異常,且僅需一次類(lèi)型轉(zhuǎn)換。這就解決了上面兩次類(lèi)型轉(zhuǎn)換所帶來(lái)的性能消耗。
本文來(lái)自朱保旭的博客園文章《C#下的強(qiáng)制類(lèi)型轉(zhuǎn)換應(yīng)用分析:()、is、as》
【編輯推薦】






