標籤:blog http 使用 ar strong 資料 div art sp
網上偶爾瀏覽到這一篇文章,還不錯就修改了下分享給大家。
工作許久了,可是對C#實值型別和C#參考型別卻一直無法很好的理解。這兩天花了不少時間尋找資料,看文章,終於有所收穫,在此將自己理解整理出來,方便日 後自己查看,同時希望對跟我有一樣困惑的朋友有所協助。廢話不多說,下面開始說說怎麼理解實值型別和參考型別!
C#實值型別資料直接在他自身分配到的記憶體中儲存資料,而C#參考型別只是包含指向儲存資料位元置的指標。
1.實值型別
那麼有哪些類型是C#實值型別的呢,我把他們歸納成三類:
1)基礎資料類型(string類型除外):包括整型、浮點型、十進位型、布爾型。
整型包括:sbyte、byte、char、short、ushort、int、uint、long、ulong 這九種類型;
浮點型就包括 float 和 double 兩種類型;
十進位型就是 decimal ;
布爾型就是 bool 型了。
2)結構類型:就是 struct 型
3)枚舉類型:就是 enum 型
2.參考型別
有五種:class(類)、interface(介面)、delegate(委託)、object(通用對象)、string(字串)
上面說的是怎麼區分哪些C#實值型別和C#參考型別,而使用上也是有區別的。所有實值型別的資料都無法為null的,聲明後必須賦以初值;參考型別才允許為null。
[csharp] view plaincopy
- int i = 0;
- //或者
- int i = new int();
- //以上兩種都是可以正確的且是等同的
- int i = null;//這樣的語句是無法通過編譯的,因為i是實值型別的,是不允許為null的
- class c = null;//這樣則是可以通過編譯的,這裡的c是參考型別的,允許為null
實值型別和參考型別在賦值(或者說複製)的時候也是有區別的。實值型別資料在賦值的時候是直接複製值到新的對象中,而參考型別則只是複製對象的引用。例如:
[csharp] view plaincopy
- 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);
- //結果是:
- //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);
- //結果是:
- //a1=2
- //a1=2
- }
這個例子就很好的說明了實值型別和參考型別的不同了。
最後還有值C#類型要麼是分配在堆棧的,要麼就是在結構中以內聯方式分配的。C#參考型別是分配在堆的。C#參考型別和C#實值型別都是從基類 Object 派生出來的。當C#實值型別需要充當對象時,就在堆上分配一個封裝(該封裝能使實值型別看上去像引用對象一樣),並且將該實值型別的值複製給它。該封裝被加上標 記,以便系統知道它包含一個實值型別。這個進程稱為裝箱,反過來操作就稱為拆箱。裝箱和拆箱能夠使任何類型像對象一樣進行處理。
理解C#實值型別和參考型別