C#系列三《C#数据类型与变量三》
??? 了解了數(shù)據(jù)類(lèi)型與變量的基本概念之后,我們來(lái)討論數(shù)據(jù)類(lèi)型的轉(zhuǎn)換與裝箱與拆箱!
?
一 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
????? 在編程時(shí) 我們有時(shí)候會(huì)遇到將一個(gè)類(lèi)型的變量轉(zhuǎn)換成另一種數(shù)據(jù)類(lèi)型,我們稱(chēng)它為數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,C#數(shù)據(jù)類(lèi)型的轉(zhuǎn)換有兩種方式如下:
???? 1.默認(rèn)安全的數(shù)據(jù)類(lèi)型轉(zhuǎn)換
????? 默認(rèn)安全的數(shù)據(jù)類(lèi)型轉(zhuǎn)換:我們稱(chēng)之為 隱式的數(shù)據(jù)類(lèi)型轉(zhuǎn)換,什么是隱式的數(shù)據(jù)類(lèi)型轉(zhuǎn)換?隱式的數(shù)據(jù)類(lèi)型轉(zhuǎn)換就是數(shù)據(jù)類(lèi)型的低范圍(參考C#數(shù)據(jù)類(lèi)型與變量一中的數(shù)據(jù)類(lèi)型的范圍)向高范圍的數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。例如:
????
1???????????? int?a?=?200;?//int?范圍是?-2147483648~2147483647?2?????????????long?b?=?a;??//long?范圍是?-9223372036854775808~9223372036854775807?表示的整數(shù)范圍更大?并且這個(gè)范圍包含200
3?????????????//所以我們認(rèn)為這兩個(gè)數(shù)據(jù)類(lèi)型轉(zhuǎn)換是默認(rèn)合法的也稱(chēng)隱式數(shù)據(jù)類(lèi)型轉(zhuǎn)換
4?????????????Console.WriteLine("b?=?"+b.ToString());
?運(yùn)行結(jié)果當(dāng)時(shí)會(huì)輸出:“b = 200”這段話(huà)啦。。
?
???? 2.強(qiáng)制的數(shù)據(jù)類(lèi)型轉(zhuǎn)換
????? 了解隱式數(shù)據(jù)類(lèi)型的轉(zhuǎn)換后,我們?cè)趤?lái)了解下強(qiáng)制的類(lèi)型轉(zhuǎn)換,強(qiáng)制類(lèi)型轉(zhuǎn)換就是,當(dāng)不滿(mǎn)足隱式數(shù)據(jù)類(lèi)型轉(zhuǎn)換的規(guī)則時(shí),的一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換的方法,強(qiáng)制數(shù)據(jù)類(lèi)型轉(zhuǎn)換必然會(huì)引發(fā)一些錯(cuò)誤,例如:
????? 將高范圍數(shù)據(jù)類(lèi)型(簡(jiǎn)稱(chēng)高)轉(zhuǎn)換低范圍數(shù)據(jù)類(lèi)型(簡(jiǎn)稱(chēng)低)時(shí),那么當(dāng)“高”變量的值,超出了“低”數(shù)據(jù)類(lèi)型的范圍時(shí),我們簡(jiǎn)稱(chēng)數(shù)據(jù)類(lèi)型溢出。代碼如下:
?
1???????????? long?a?=?3333333333;?//long?范圍是?-9223372036854775808~9223372036854775807?->3333333333在這個(gè)范圍中合法2?????????????int?b?=?(int)a;??//int?范圍是?-2147483648~2147483647??->?3333333333?超出了這個(gè)范圍?所以導(dǎo)致數(shù)據(jù)類(lèi)型溢出
3?????????????Console.WriteLine("a?="?+?a.ToString());
4?????????????Console.WriteLine("b?="+b.ToString());//類(lèi)型溢出這里會(huì)輸出一個(gè)非常大的負(fù)數(shù)
輸出結(jié)果如下:
二 裝箱與拆箱
???? 理解完基本數(shù)據(jù)類(lèi)型的轉(zhuǎn)換后我們來(lái)看一下值類(lèi)型與引用類(lèi)型之間的轉(zhuǎn)換,我們稱(chēng)為裝箱與拆箱。
???? 1.裝箱
???? 裝箱就將值類(lèi)型轉(zhuǎn)換成引用類(lèi)型:????
int?a?=?10;object?obj?=?a;?//將值類(lèi)型轉(zhuǎn)換引用類(lèi)型,裝箱操作
????在裝箱操作時(shí),運(yùn)行時(shí)會(huì)在托管堆上分配一個(gè)空間,存放a 中的10,并標(biāo)志這塊空間的裝箱類(lèi)型是int。
??? 如圖:
?????2.拆箱
???? 那拆箱就跟裝箱相反,就是將引用類(lèi)型還原會(huì)值類(lèi)型。???
int?a?=?10;object?obj?=?a;?//將值類(lèi)型轉(zhuǎn)換引用類(lèi)型 裝箱
int?b?=?(int)obj;?//將引用類(lèi)型轉(zhuǎn)換為值類(lèi)型 拆箱
???? 當(dāng)拆箱時(shí)我們會(huì)將推中的10強(qiáng)制類(lèi)型轉(zhuǎn)換放到棧空間中(圖中代表int b)。
??? 如圖:
???? 3.裝箱與拆箱的作用
????? 當(dāng)我需要顯示的方法,分別來(lái)顯示 int float double類(lèi)型的值到控制臺(tái)。一般我們的設(shè)計(jì)方法如下:????
?
class?MyProgram{
????//用來(lái)打印int類(lèi)型的值
????public?static?void?ShowInt(int?a)
????{
???????Console.WriteLine("?a?="+a.ToString());
????}
????//用來(lái)打印float類(lèi)型的值
????public?static?void?ShowFloat(float?a)
????{
???????Console.WriteLine("?a?="+a.ToString());
????}
????//用來(lái)打印double類(lèi)型的值
????public?static?void?ShowDouble(double?a)
????{
???????Console.WriteLine("?a?="+a.ToString());
????}
????static?void?Main(string[]?args)
????{
????????int?a?=?10;
????????ShowInt(a);
?
????????float?b?=?2.2;
????????ShowFloat(b);
????????double?c?=?2.22;
????????ShowDouble(c);
????}
}
那么我們思考一下,這個(gè)時(shí)候我需要在支持 string , short,char等等的類(lèi)型顯示的時(shí)候,我們是不是需要對(duì)每一個(gè)類(lèi)型都定義一個(gè)顯示的方法? 此時(shí)我們?cè)诳纯匆肓搜b箱與拆箱概念的方法設(shè)計(jì):?
class?MyProgram{
???//將參數(shù)類(lèi)型改為object
????public?static?void?ShowObject(object?obj)
????{
???????Console.WriteLine("obj?="+obj.ToString());
????}
????static?void?Main(string[]?args)
????{
????????int?a?=?10;
????????ShowObject(a);?//int?a?被裝箱
?
????????float?b?=?2.2;//float?b?被裝箱
????????ShowObject(b);
????????double?c?=?2.22;//double?c?被裝箱
????????ShowObject(c);
????}
}
?
這樣我們將來(lái)不管需要擴(kuò)展多少數(shù)據(jù)類(lèi)型我們這個(gè)方法都可以滿(mǎn)足。
?
?OK 數(shù)據(jù)類(lèi)型與變量部分結(jié)束。下一篇介紹一下 C#的運(yùn)算符。
轉(zhuǎn)載于:https://www.cnblogs.com/doubleliang/archive/2011/05/11/2043721.html
總結(jié)
以上是生活随笔為你收集整理的C#系列三《C#数据类型与变量三》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 特斯拉 2023 年 1 月在中国大陆新
- 下一篇: C#系列五《程序的分支》