c#入門(mén)之類(lèi)型轉(zhuǎn)換詳解
“無(wú)論是什么類(lèi)型,所有的數(shù)據(jù)都是一系列的位,即一系列0和1。變量的含義是通過(guò)解釋這些數(shù)據(jù)的方式來(lái)傳達(dá)的?!薄@句原話是書(shū)上翻譯的,不過(guò)后一句話總感覺(jué)理解起來(lái)不是很通俗,自己覺(jué)得這樣理解可能會(huì)合適些:無(wú)論什么類(lèi)型的數(shù)據(jù),在計(jì)算機(jī)存儲(chǔ)時(shí)都是0和1,而變量的意義,就是以不同的方式來(lái)解釋這些數(shù)據(jù),以達(dá)到滿足程序應(yīng)用、節(jié)約內(nèi)存等需求。
換句話說(shuō):變量存在的意義,就是建立規(guī)(標(biāo))范(準(zhǔn))的數(shù)據(jù)存儲(chǔ)方式。
隱式轉(zhuǎn)換
類(lèi)型轉(zhuǎn)換分兩種形式:隱式轉(zhuǎn)換、顯示轉(zhuǎn)換。
隱式轉(zhuǎn)換不需要單獨(dú)的表達(dá)式,只需要把滿足隱式轉(zhuǎn)換條件的兩個(gè)變量做相應(yīng)的表達(dá)式操作即可,但隱式轉(zhuǎn)換的結(jié)果可能并不是自己意料之中的:
ushort destinationVar;
char sourceVar = 'a';
destinationVar = sourceVar;
Console.WriteLine("sourceVar: {0}", sourceVar);
Console.WriteLine("destinationVar: {0}\n",destinationVar);
上面的輸出結(jié)果,sourceVar的是a,而destinationVar雖然=sourceVar,但輸出的結(jié)果是97??梢钥闯?,雖然兩種數(shù)據(jù)類(lèi)型滿足隱式轉(zhuǎn)換的條件(存儲(chǔ)的值范圍),但不同的表達(dá)類(lèi)型決定了最終的結(jié)果也不一樣。另外,和大多數(shù)編程一樣,隱式轉(zhuǎn)換時(shí),只要類(lèi)型A的取值范圍比類(lèi)型B的范圍小,就可以隱藏轉(zhuǎn)換為B。
顯示轉(zhuǎn)換
在顯示轉(zhuǎn)換中,可以使用強(qiáng)制轉(zhuǎn)換和Convert。
強(qiáng)制轉(zhuǎn)換只在某些情況下可以,可能應(yīng)用的場(chǎng)景不太豐富,當(dāng)然,這個(gè)的確要方便一些,在變量前加上類(lèi)似 (byte) 的代碼就可以了:
byte destinationVar;
short sourceVar = 281;
destinationVar = (byte)sourceVar;
Console.WriteLine("sourceVar: {0}", sourceVar);
Console.WriteLine("destinationVar: {0}\n",destinationVar);
這個(gè)例子比較有意思,輸出的結(jié)果是:sourceVar: 281, destinationVar: 25; 為什么不是變更為255?這就回到開(kāi)頭提到的了,其實(shí)轉(zhuǎn)換過(guò)程中,丟掉的是數(shù)據(jù)存儲(chǔ)的二進(jìn)制位:
在轉(zhuǎn)換的過(guò)程中,會(huì)把超過(guò)取值范圍(255二進(jìn)制位)的那個(gè)1丟掉,保留其它的位,所以最終結(jié)果是25,而不是255,也不是281。
Convert轉(zhuǎn)換應(yīng)該是常用的方式,因?yàn)樗冀K會(huì)進(jìn)行溢出檢查。
溢出檢查配置
有些東西雖然沒(méi)什么用,但是我們應(yīng)該知道,否則出問(wèn)題的時(shí)候就不知道怎么解決了。配置:解決方案資源管理器 - 右鍵 - 屬性 - 生成 - 高級(jí) - 檢查運(yùn)算上溢/下溢:
當(dāng)然,對(duì)于強(qiáng)制轉(zhuǎn)換可能需要這個(gè)配置,但使用Convert轉(zhuǎn)換時(shí)始終會(huì)進(jìn)行溢出檢查的,所以這個(gè)配置和checked/unchecked就不起作用了。
結(jié)語(yǔ)
每次一看見(jiàn)那些數(shù)據(jù)類(lèi)型、表達(dá)式的列表表格就頭疼,因?yàn)楦居洸蛔?。就像哪些?lèi)型可以怎么轉(zhuǎn)換成其它的類(lèi)型的表格一樣,其實(shí)個(gè)人感覺(jué)大可不必去記住這些,在實(shí)際做項(xiàng)目的過(guò)程中,只要記得有這方面的功能就行了,具體用哪一個(gè),可以再回過(guò)頭來(lái)翻書(shū)或google。
應(yīng)該掌握的是:記住存在隱式轉(zhuǎn)換,但這種方式應(yīng)該盡量少用吧。而顯示轉(zhuǎn)換,方便的就直接用(),當(dāng)然,最可靠的應(yīng)該是Convert,因?yàn)樵谵D(zhuǎn)換時(shí),Convert始終都會(huì)進(jìn)行溢出檢查。
- C#強(qiáng)制類(lèi)型轉(zhuǎn)換小結(jié)
- C#將布爾類(lèi)型轉(zhuǎn)換成字節(jié)數(shù)組的方法
- C#匿名方法與Delegate類(lèi)型轉(zhuǎn)換錯(cuò)誤分析
- C#引用類(lèi)型轉(zhuǎn)換的常見(jiàn)方式總結(jié)
- c#之用戶定義的數(shù)據(jù)類(lèi)型轉(zhuǎn)換介紹
- C#用戶定義類(lèi)型轉(zhuǎn)換詳解
- c#將list類(lèi)型轉(zhuǎn)換成DataTable方法示例
- 淺析C#數(shù)據(jù)類(lèi)型轉(zhuǎn)換的幾種形式
- C#中判斷某類(lèi)型是否可以進(jìn)行隱式類(lèi)型轉(zhuǎn)換
- C#自動(dòng)類(lèi)型轉(zhuǎn)換與強(qiáng)制類(lèi)型轉(zhuǎn)換的講解
相關(guān)文章
C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法
這篇文章主要介紹了C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法,可實(shí)現(xiàn)簡(jiǎn)單的文本加密功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)
C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)...2007-04-04C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
這篇文章主要介紹了C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放,涉及C#采用Dispose模式操作資源的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝示例
這篇文章主要介紹了C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝,分析了微信網(wǎng)頁(yè)授權(quán)操作的原理、步驟并給出了C#實(shí)現(xiàn)的網(wǎng)頁(yè)授權(quán)操作邏輯封裝類(lèi),需要的朋友可以參考下2016-10-10C#基于SerialPort類(lèi)實(shí)現(xiàn)串口通訊詳解
這篇文章主要為大家詳細(xì)介紹了C#基于SerialPort類(lèi)實(shí)現(xiàn)串口通訊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01