首頁  >  文章  >  後端開發  >  比較C#中值類型和參考類型的區別

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

巴扎黑
巴扎黑原創
2017-09-06 11:13:441584瀏覽

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.未裝箱的值類型不在堆上分配,所以該類型的一個實例一旦不在活動,為他們分配的存儲就會釋放,不會等待垃圾回收

以上是比較C#中值類型和參考類型的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn