天天看點

值類型,引用類型,裝箱,拆箱

  • 值類型包括原類型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚舉(enum)、結構(struct),引用類型包括:類、數組、接口、委托、字元串等。
  • 值型就是在棧中配置設定記憶體,在申明的同時就初始化,以確定資料不為NULL;

    引用型是在堆中配置設定記憶體,初始化為null,引用型是需要GARBAGE COLLECTION來回收記憶體的,值型不用,超出了作用範圍,系統就會自動釋放!

  •  值類型的變量包含自身的資料,而引用類型的變量是指向資料的記憶體塊的,并不是直接存放資料。對于值類型,每個變量都有一份自己的資料複制,對另一個值類型變量的操作并不影響這一個變量的值。 而對于引用類型,兩個變量有可能引用同一對象,是以對一個變量的操作會影響到另一個變量。
  • 如果要把一個值類型資料放到堆上,就需要裝箱操作;反之,把一個放在堆上的值類型資料取出來,則需要進行拆箱操作。
  • 裝箱是将值類型轉換為 object 類型或由此值類型實作的任何接口類型的過程。 當 CLR 對值類型進行裝箱時,會将該值包裝到 System.Object 内部,再将後者存儲在托管堆上。 取消裝箱将從對象中提取值類型。 裝箱是隐式的;取消裝箱是顯式的。 裝箱和取消裝箱的概念是類型系統 C# 統一視圖的基礎,其中任一類型的值都被視為一個對象。
  • 裝箱用于在垃圾回收堆中存儲值類型。 裝箱是值類型到 object 類型或到此值類型所實作的任何接口類型的隐式轉換。 對值類型裝箱會在堆中配置設定一個對象執行個體,并将該值複制到新的對象中。
  • 取消裝箱是從 object 類型到值類型或從接口類型到實作該接口的值類型的顯式轉換。 取消裝箱操作包括:
    • 檢查對象執行個體,以確定它是給定值類型的裝箱值。
    • 将該值從執行個體複制到值類型變量中。
  • 要在運作時成功取消裝箱值類型,被取消裝箱的項必須是對一個對象的引用,該對象是先前通過裝箱該值類型的執行個體建立的。 嘗試取消裝箱 null 會導緻 NullReferenceException。 嘗試取消裝箱對不相容值類型的引用會導緻InvalidCastException。
  • 裝箱拆箱過程:
  • 值類型,引用類型,裝箱,拆箱
  • 為什麼要減少裝箱和拆箱操作:一個就是對于堆的操作效率比較低;另一個就是對于堆上配置設定的記憶體資源,需要GC來回收,進而降低程式效率。

轉載于:https://www.cnblogs.com/chuwachen/p/3910989.html

c#