1. 程式人生 > 其它 >C# 8.0 in a Nutshell 值型別和引用型別 記錄

C# 8.0 in a Nutshell 值型別和引用型別 記錄

值型別包含大多數的內建型別以及自定義的struct型別和enum型別。

引用型別包含所有的類、陣列、委託和介面型別。

值型別和引用型別最根本的不同在於它們在記憶體中的處理方式。

值型別

  • 值型別的變數或常量的內容僅僅是一個值。
  • 通過struct關鍵字自定義值型別。
  • 值型別實列的賦值總是會進行實列複製,賦值操作複製了值型別的實列。

引用型別

  • 引用型別由兩部分組成:物件和物件的引用。
  • 引用型別變數或常量中的內容是一個含值物件的引用。
  • 給引用型別變數賦值只會複製引用,而不會複製物件例項。
  • 允許不同的變數指向同一個物件,而值型別通常不會出現這種情況。
  • 賦值操作複製了引用。
  • 引用可以用字面量null賦值,表示它並不指向任何物件

儲存開銷
值型別實列佔用的記憶體大小就是儲存其欄位所需的記憶體。

引用型別要求為引用和物件單獨分配儲存空間。物件除佔用和欄位一樣的位元組數外,還需要而外的管理空間開銷。管理開銷的精確值本質上屬於.NET執行時實現的細節,但最少也需要8個位元組來儲存該物件的型別的鍵以及一些臨時的資訊(如執行緒鎖的狀態及是否可以被垃圾回收器固定等)。根據.NET執行時是工作在32位還是64位的平臺上,每一個物件的引用都需要額外的4或8個位元組的儲存空間。

待續...