C#數(shù)據(jù)類型簡(jiǎn)單介紹
C#有很多值得學(xué)習(xí)的地方,這里我們主要介紹C#數(shù)據(jù)類型,包括介紹結(jié)構(gòu)數(shù)據(jù)類型是C#的一種內(nèi)置數(shù)據(jù)類型等方面。
C#中的值型變量和引用型變量是有區(qū)別的
與C++一樣,C#也是一種強(qiáng)類型編程語言。C#數(shù)據(jù)類型被分為了二大類:C#語言本身所固有的數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型,這一點(diǎn)也與C++相似。
此外,C#語言還把變量分為值類型和引用類型。除非是被包含在一個(gè)引用類型中,值類型變量的值保留在棧中,這一點(diǎn)與C++中的變量非常相似。引用類型的變量也是棧的一種,它的值是堆中對(duì)象的地址,與C++中的指針非常地相似。值類型變量的值被直接傳遞給方法,引用型變量在被作為參數(shù)傳遞給方法時(shí),傳遞的是索引。
類和界面可以創(chuàng)建引用類變量,但需要指出的是,結(jié)構(gòu)數(shù)據(jù)類型是C#的一種內(nèi)置數(shù)據(jù)類型,同時(shí)也是一種值型的數(shù)據(jù)類型。
注意隱性的C#數(shù)據(jù)類型轉(zhuǎn)換
Boxing和unboxing是使值型數(shù)據(jù)類型被當(dāng)作索引型數(shù)據(jù)類型使用的二個(gè)過程。值型變量可以被包裝進(jìn)一個(gè)對(duì)象中,然后再被解包回值型變量。包括內(nèi)置數(shù)據(jù)類型在內(nèi)的所有C#數(shù)據(jù)類型都可以被隱性地轉(zhuǎn)化為一個(gè)對(duì)象。包裝一個(gè)值型變量就會(huì)生成一個(gè)對(duì)象的實(shí)例,然后將變量拷貝到實(shí)例中。
Boxing是隱性的,如果在需要索引型數(shù)據(jù)類型的地方使用了值型數(shù)據(jù)類型的變量,值型變量就會(huì)隱性地轉(zhuǎn)化為索引型數(shù)據(jù)類型的變量。Boxing會(huì)影響代碼執(zhí)行的性能,因此應(yīng)當(dāng)盡量避免,尤其是在數(shù)據(jù)量較大的時(shí)候。
如果要將一個(gè)打包的對(duì)象轉(zhuǎn)換回原來的值型變量,必須顯性地對(duì)它進(jìn)行解包。解包需要二個(gè)步驟:首先對(duì)對(duì)象實(shí)例進(jìn)行檢查,確保它們是由值型的變量被包裝成的;第二步將實(shí)例中的值拷貝到值型變量中。為了確保解包成功,被解包的對(duì)象必須是通過打包一個(gè)值型變量的值生成的對(duì)象的索引。
- using System;
- public class UnboxingTest
- {
- public static void Main()
- {
- int i = 123;
- //打包
- object o = i;
- // 解包(必須是顯性的)
- int j = (int) o;
- Console.WriteLine("j: {0}", j);
- }
- }
如果被解包的對(duì)象是無效的,或是一個(gè)不同數(shù)據(jù)類型對(duì)象的索引,就會(huì)產(chǎn)生InvalidCastException異外。
【編輯推薦】