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