新聞中心
工作許久了,可是對C#值類型和C#引用類型卻一直無法很好的理解。這兩天花了不少時間查找資料,看文章,終于有所收獲,在此將自己理解整理出來,方便日后自己查看,同時希望對跟我有一樣困惑的朋友有所幫助。廢話不多說,下面開始說說怎么理解值類型和引用類型!

創(chuàng)新互聯(lián)從2013年創(chuàng)立,公司以網(wǎng)站設計制作、成都網(wǎng)站設計、系統(tǒng)開發(fā)、網(wǎng)絡推廣、文化傳媒、企業(yè)宣傳、平面廣告設計等為主要業(yè)務,適用行業(yè)近百種。服務企業(yè)客戶上1000家,涉及國內(nèi)多個省份客戶。擁有多年網(wǎng)站建設開發(fā)經(jīng)驗。為企業(yè)提供專業(yè)的網(wǎng)站建設、創(chuàng)意設計、宣傳推廣等服務。 通過專業(yè)的設計、獨特的風格,為不同客戶提供各種風格的特色服務。
C#值類型數(shù)據(jù)直接在他自身分配到的內(nèi)存中存儲數(shù)據(jù),而C#引用類型只是包含指向存儲數(shù)據(jù)位置的指針。
那么有哪些類型是C#值類型的呢,我把他們歸納成三類:
基礎數(shù)據(jù)類型(string類型除外):包括整型、浮點型、十進制型、布爾型。
整型包括:sbyte、byte、char、short、ushort、int、uint、long、ulong 這九種類型;
浮點型就包括 float 和 double 兩種類型;
十進制型就是 decimal ;
布爾型就是 bool 型了。
結(jié)構(gòu)類型:就是 struct 型
枚舉類型:就是 enum 型
引用類型有五種:class、interface、delegate、object、string
上面說的是怎么區(qū)分哪些C#值類型和C#引用類型,而使用上也是有區(qū)別的。所有值類型的數(shù)據(jù)都無法為null的,聲明后必須賦以初值;引用類型才允許為null。
- int i = 0;
- //或者
- int i = new int();
- //以上兩種都是可以正確的且是等同的
- int i = null;//這樣的語句是無法通過編譯的,因為i是值類型的,是不允許為null的
- class c = null;//這樣則是可以通過編譯的,這里的c是引用類型的,允許為null
值類型和引用類型在賦值(或者說復制)的時候也是有區(qū)別的。值類型數(shù)據(jù)在賦值的時候是直接復制值到新的對象中,而引用類型則只是復制對象的引用。例如:
- public class abc
- {
- public int Attribute;
- public abc()
- {
- Attribute = 1;
- }
- }
- public static void Main()
- {
- int i = 0;
- int j = i;
- i = 1;
- Console.WriteLine("i={0}",i);
- Console.WriteLine("j={0}",j);
- //結(jié)果是:
- //i=1
- //j=0
- abc a1 = new abc();
- abc a2 = a1;
- a1.Attribute = 2;
- Console.WriteLine("a1={0}",a1.Attribute);
- Console.WriteLine("a2={0}",a2.Attribute);
- //結(jié)果是:
- //a1=2
- //a1=2
- }
這個例子就很好的說明了值類型和引用類型的不同了。
***還有值C#類型要么是分配在堆棧的,要么就是在結(jié)構(gòu)中以內(nèi)聯(lián)方式分配的。C#引用類型是分配在堆的。C#引用類型和C#值類型都是從基類 Object 派生出來的。當C#值類型需要充當對象時,就在堆上分配一個包裝(該包裝能使值類型看上去像引用對象一樣),并且將該值類型的值復制給它。該包裝被加上標記,以便系統(tǒng)知道它包含一個值類型。這個進程稱為裝箱,反過來操作就稱為拆箱。裝箱和拆箱能夠使任何類型像對象一樣進行處理。
新聞標題:理解C#值類型和引用類型
本文鏈接:http://m.fisionsoft.com.cn/article/djehiji.html


咨詢
建站咨詢
