2020-05-04

C#中的數(shù)據(jù)類型轉(zhuǎn)換

數(shù)據(jù)類型在一定的條件下是可以相互轉(zhuǎn)換的,如將int型數(shù)據(jù)轉(zhuǎn)換成double型數(shù)據(jù)。C#允許使用兩種轉(zhuǎn)換方式:隱式轉(zhuǎn)換和顯式轉(zhuǎn)換。

1、隱式轉(zhuǎn)換

隱式轉(zhuǎn)換:從類型A到類型B的轉(zhuǎn)換可以在所有情況下進(jìn)行,執(zhí)行轉(zhuǎn)換的規(guī)則非常簡單,可以讓編譯器執(zhí)行轉(zhuǎn)換。

隱式轉(zhuǎn)換不需要做任何工作,也不需要另外編寫代碼。如將int型數(shù)據(jù)轉(zhuǎn)換成double型數(shù)據(jù):

inta =10;doubleb = a;//隱式轉(zhuǎn)換

隱式轉(zhuǎn)換規(guī)則是:任何類型A,只要其取值范圍完全包含在類型B的取值范圍內(nèi),就可以隱式轉(zhuǎn)換為類型B?;谶@個(gè)轉(zhuǎn)換規(guī)則,C#的隱式轉(zhuǎn)換不會(huì)導(dǎo)致數(shù)據(jù)丟失。需要注意的是我們最常用的簡單類型bool和string沒有隱式轉(zhuǎn)換。

2、顯式轉(zhuǎn)換

顯式轉(zhuǎn)換:從類型A到類型B的轉(zhuǎn)換只能在某些情況下進(jìn)行,轉(zhuǎn)換規(guī)則比較復(fù)雜,應(yīng)進(jìn)行某種類型的額外處理。顯式轉(zhuǎn)換又叫強(qiáng)制類型轉(zhuǎn)換,顯式轉(zhuǎn)換需要用戶明確的指定轉(zhuǎn)換類型。如將double類型數(shù)據(jù)轉(zhuǎn)換成int類型數(shù)據(jù):

doublec =10.5;

? ? ? ? ? ? intd = (int)c;//顯示轉(zhuǎn)換

提醒:

(1)、顯式轉(zhuǎn)換可能會(huì)導(dǎo)致錯(cuò)誤。進(jìn)行這種轉(zhuǎn)換時(shí)編譯器將對(duì)轉(zhuǎn)換進(jìn)行溢出檢測。如果有溢出說明轉(zhuǎn)換失敗,就表明源類型不是一個(gè)合法的目標(biāo)類型。無法進(jìn)行類型轉(zhuǎn)換。

(2)、強(qiáng)制類型轉(zhuǎn)換會(huì)造成數(shù)據(jù)丟失,如上面的例子中,最終得到的d值為10。

3、通過方法進(jìn)行類型轉(zhuǎn)換

(1)、使用ToString()方法。所有類型都繼承了Object基類,所以都有ToString()這個(gè)方法(轉(zhuǎn)化成字符串的方法)。

(2)、通過int.Parse()方法轉(zhuǎn)換,參數(shù)類型只支持string類型。注意:使用該方法轉(zhuǎn)換時(shí)string的值不能為為NULL,不然無法通過轉(zhuǎn)換;另外string類型參數(shù)也只能是各種整型,不能是浮點(diǎn)型,不然也無法通過轉(zhuǎn)換 (例如int.Parse("2.0")就無法通過轉(zhuǎn)換)。

int i;

? ? ? ? ? ? i =int.Parse("100");

(3)、通過int.TryParse()方法轉(zhuǎn)換,該轉(zhuǎn)換方法與int.Parse()轉(zhuǎn)換方法類似,不同點(diǎn)在于int.Parse()方法無法轉(zhuǎn)換成功的情況該方法能正常執(zhí)行并返回0。也就是說int.TryParse()方法比int.Parse()方法多了一個(gè)異常處理,如果出現(xiàn)異常則返回false,并且將輸出參數(shù)返回0。

int i;

? ? ? ? ? ? strings =null;

? ? ? ? ? ? int.TryParse(s,outi);

(4)、通過Convert類進(jìn)行轉(zhuǎn)換,Convert類中提供了很多轉(zhuǎn)換的方法。使用這些方法的前提是能將需要轉(zhuǎn)換的對(duì)象轉(zhuǎn)換成相應(yīng)的類型,如果不能轉(zhuǎn)換則會(huì)報(bào)格式不對(duì)的錯(cuò)誤。注意:使用Convert.ToInt32(double value)時(shí),如果 value 為兩個(gè)整數(shù)中間的數(shù)字,則返回二者中的偶數(shù);即 4.5 轉(zhuǎn)換為 4,而 5.5 轉(zhuǎn)換為 6。

(5)、實(shí)現(xiàn)自己的轉(zhuǎn)換,通過繼承接口IConventible或者TypeConventer類,從而實(shí)現(xiàn)自己的轉(zhuǎn)換。

4、使用AS操作符轉(zhuǎn)換

使用AS操作符轉(zhuǎn)換,但是AS只能用于引用類型和可為空的類型。使用as有很多好處,當(dāng)無法進(jìn)行類型轉(zhuǎn)換時(shí),會(huì)將對(duì)象賦值為NULL,避免類型轉(zhuǎn)換時(shí)報(bào)錯(cuò)或是出異常。C#拋出異常在進(jìn)行捕獲異常并進(jìn)行處理是很消耗資源的,如果只是將對(duì)象賦值為NULL的話是幾乎不消耗資源的(消耗很小的資源)。

5、裝箱和拆箱

裝箱和拆箱在值類型和引用類型之間架起了一座橋梁,使得任何 value-type 的值都可以轉(zhuǎn)換為 object 類型的值,反過來轉(zhuǎn)換也可以。

裝箱:裝箱是指將一個(gè)值類型的數(shù)據(jù)隱式地轉(zhuǎn)換成一個(gè)對(duì)象類型(object)的數(shù)據(jù)。執(zhí)行裝箱操作時(shí)不可避免的要在堆上申請(qǐng)內(nèi)存空間,并將堆棧上的值類型數(shù)據(jù)復(fù)制到申請(qǐng)的堆內(nèi)存空間上,這肯定是要消耗內(nèi)存和cpu資源的。注意:在執(zhí)行裝箱轉(zhuǎn)換時(shí),也可以使用顯式轉(zhuǎn)換。

拆箱:拆箱是指將一個(gè)對(duì)象類型的數(shù)據(jù)顯式地轉(zhuǎn)換成一個(gè)值類型數(shù)據(jù)。拆箱過程是裝箱的逆過程,是將存儲(chǔ)在堆上的引用類型值轉(zhuǎn)換為值類型并賦給值類型變量。拆箱操作分為兩步:一是檢查對(duì)象實(shí)例,確保它是給定值類型的一個(gè)裝箱值;而是將該值從實(shí)例復(fù)制到值類型變量中。

裝箱和拆箱都是要消耗內(nèi)存和cpu資源的,也就造成效率降低,所以要盡量避免使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容