比較C#中實值型別和參考型別的區別

來源:互聯網
上載者:User
CLR支援兩種類型:實值型別和參考型別,看起來FCL的大多數類型是參考型別,但用的最多的還是實值型別。參考型別總是從託管堆中分配,在用new操作符執行個體一個對象,返回對象記憶體位址存放在一個變數中。在使用參考型別時要瞭解其四個心理因素:

       1.記憶體必須從託管堆中分配

       2.堆上分配的每個對象都有一些額外成員,這些成員在使用前必須初始化。

       3.對象中的其他位元組總是設為零。

       4.從託管堆指派至時,可能強制執行一次記憶體回收。

由此可見,參考型別若是濫用勢必造成過載。再看實值型別,其是輕量級類型,一般分配線上程棧上也可嵌入到參考型別對象中,承載它的變數不包含指向執行個體的指標,當然也不受記憶體回收行程的控制,因此實值型別的使用緩解了託管堆的壓力,減少了應用程式生存期內的記憶體回收的次數。

   C#中稱為‘類’的都是參考型別,而實值型別都成為結構或枚舉。所有結構都是由抽象類別型System.ValueType直接派生。而其本身有直接從Object派生,所有枚舉從System.Enum抽象類別型派生,Enum又從ValueType派生,環環相扣啊。

在設計自己的類型時,什麼時候將定義成實值型別呢?

      1.類型具有基元類型的行為(編譯器直接支援的資料類型(像Int32,Int64等))

      2.類型不需要從其他任何類型繼承。

      3.類型也不派生出其他任何類型。

      4.由於實值型別在作為實參或是傳回值的時候,需要進行相應欄位的複製,如若執行個體過大,會造成一定的效能損失。

      所以要求類型執行個體較小(16位元組以內),執行個體較大,但不作為方法實參傳遞和從方法返回也可。

關於實值型別和參考型別的區別,大致列了一下幾點:

     1.參考型別處於已裝箱形式,實值型別處於未裝箱形式,兩者也可通過一定方式互相轉換(具體說明會在下一篇部落格中詳談)

     2.實值型別不應引入任何新的虛方法,所有方法都不能是抽象的,且都是隱式密封防止重寫。

     3.將實值型別變數賦給另一個實值型別變數,會執行逐欄位複製。將參考型別的變數付給另一個參考型別,只複製記憶體位址。兩個或多個參考型別變數能引用堆上的同一個對象,對一個變數執行的操作可能影響到另一個變數引用的對象。相反,實值型別變數獨立,不互相影響。

     4.未裝箱的實值型別不在堆上分配,所以該類型的一個執行個體一旦不在活動,為他們分配的儲存就會釋放,不會等待記憶體回收
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.