理解C#實值型別和參考型別

來源:互聯網
上載者:User

標籤: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
  1. int i = 0;     
  2. //或者     
  3. int i = new int();     
  4. //以上兩種都是可以正確的且是等同的     
  5. int i = null;//這樣的語句是無法通過編譯的,因為i是實值型別的,是不允許為null的     
  6. class c = null;//這樣則是可以通過編譯的,這裡的c是參考型別的,允許為null    

        實值型別和參考型別在賦值(或者說複製)的時候也是有區別的。實值型別資料在賦值的時候是直接複製值到新的對象中,而參考型別則只是複製對象的引用。例如:

[csharp] view plaincopy
  1. public class abc     
  2. {     
  3. public int Attribute;     
  4. public abc()     
  5. {     
  6. Attribute = 1;     
  7. }     
  8. }     
  9. public static void Main()     
  10. {     
  11. int i = 0;     
  12. int j = i;     
  13. i = 1;     
  14. Console.WriteLine("i={0}",i);     
  15. Console.WriteLine("j={0}",j);     
  16. //結果是:     
  17. //i=1     
  18. //j=0     
  19. abc a1 = new abc();     
  20. abc a2 = a1;     
  21. a1.Attribute = 2;     
  22. Console.WriteLine("a1={0}",a1.Attribute);     
  23. Console.WriteLine("a2={0}",a2.Attribute);     
  24. //結果是:     
  25. //a1=2     
  26. //a1=2     
  27. }    

        這個例子就很好的說明了實值型別和參考型別的不同了。

        最後還有值C#類型要麼是分配在堆棧的,要麼就是在結構中以內聯方式分配的。C#參考型別是分配在堆的。C#參考型別和C#實值型別都是從基類 Object 派生出來的。當C#實值型別需要充當對象時,就在堆上分配一個封裝(該封裝能使實值型別看上去像引用對象一樣),並且將該實值型別的值複製給它。該封裝被加上標 記,以便系統知道它包含一個實值型別。這個進程稱為裝箱,反過來操作就稱為拆箱。裝箱和拆箱能夠使任何類型像對象一樣進行處理。

理解C#實值型別和參考型別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.