C#把數據類型分為兩種:值類型和引用類型。
值類型的變量直接指向存儲的值,引用類型的變量指向值的引用。[理解:引用就像一個柜子的號碼牌,可以順藤摸瓜找到柜子。假如你再次對一個值類型的變量賦值,那么就會改變值,假如你再次對一個引用類型的變量賦值,那么就只是換了一個號碼牌,指向了其他的柜子,對前一個柜子是不做修改的。]
這兩種類型的數據存儲在內存的不同地方,值類型數據存儲在堆棧中,而引用類型的數據(值的引用)存儲在托管堆上。
int i=20;int j=i;
int定義整數類型的變量,整數類型屬于值類型,j在賦值的時候復制了i的值,所以這會在內存的兩個地方存儲值20,如果改變其中一個,不會影響另外一個。
Apple a = new Apple();a.color = "red";Apple b = a;b.color = "green";
Apple是我們定義的蘋果類型,我們用new Apple()創造了一個實際的蘋果,并用引用類型的變量a指向了這個創造的蘋果。
在第二行設定了蘋果的顏色是紅色。
在第三行我們添加了一個新變量,賦值了a這個引用類型的數據,所以b也是指向了a指向的那個蘋果,并沒有產生第二個蘋果。
在第四行,我們修改b指向的蘋果的顏色為綠色,這時候實際上查看a.color也會發現蘋果的顏色是綠色了,因為始終就只有一個蘋果呀。
Apple a = null;
這表示讓一個蘋果類型的變量不指向任何實際的蘋果,如果你想使用這個變量a代表的實際的蘋果,就會報錯,因為沒有東西呀,怎么能使用呢。值類型的變量就不可以賦值null,這是引用類型的專利。
當已經沒有任何一個變量指向某個實例的時候,這個實例就不能被訪問到了,CLR的垃圾收集器會定期找尋這樣的實例,刪除它們,把它們占用的內存返回給操作系統。
C#有15個預定義類型,其中13個是值類型,兩個是引用類型(string和object)
13個值類型中有8個整型:{分正負的:8位sbyte,16位short,32位int,64位long}{無符號的:8位byte,16位ushort,32位uint,64位ulong}。
13個值類型中有2個浮點類型:{float:32位單精度浮點數}{double:64位雙精度浮點數}。
13個值類型中還有:{decimal:通常用于財務計算的128位高精度十進制表示法}{bool:用于包含布爾值true或false}{char:為了保存單個字符的值}。
值類型的賦值方法:
int i = 1234;uint ui = 1234U;long l = 1234L;long x = 0x12ab;//用16進制賦值需添加0x前綴ulong ul = 1234UL;float f = 12.3Fdouble d = 12.3;decimal d = 12.30M;bool b = true;char c = 'A';char c = '/n';//轉義符
2個預定義的引用類型:{object:根類型,面向對象概念}{string:字符串類型,但擁有許多值類型的特性,使它常被誤認為值類型}
新聞熱點
疑難解答