解釋 .NET 中的自定義值型別


值型別的變數直接包含值。當您將一個值型別變數賦值給另一個變數時,每個變數都關聯著記憶體中不同的儲存位置。因此,更改一個值型別變數的值不會影響第二個變數的值。

類似地,當您將值型別的例項傳遞給方法時,編譯器會將與引數關聯的記憶體複製到與引數關聯的新位置。對引數的任何更改都不會影響原始值。由於值型別會複製記憶體,因此它們應該很小(通常小於 16 位元組)。

所有 C# 內建型別(例如 int、bool 等)都是值型別,除了 string 和 object,它們是引用型別。您還可以使用自定義值型別建立自己的值型別。C# 中有兩種自定義值型別:結構體和列舉。

結構體

結構體在語法上類似於類和介面,只是它們在型別名稱之前使用關鍵字 struct。與類類似,結構體可以包含欄位、屬性、方法和建構函式。例如,名為 Point 的結構體可以定義如下。

struct Point{
   public int X { get; set; }
   public int Y { get; set; }
}

結構體中的建構函式必須初始化結構體內的所有欄位和屬性。這樣做是為了確保值型別變數由建構函式完全初始化。未能初始化結構體內的所有資料會導致編譯時錯誤。

所有結構體型別都派生自 System.ValueType,並且預設情況下是密封的。這意味著您不能從結構體繼承。結構體型別可以實現介面。

列舉

列舉是一種值型別,您可以使用一組命名常量來宣告它。要定義列舉型別,請使用 enum 關鍵字後跟其成員的名稱。

enum Protocol{
   TCP,
   IP,
   UDP
}

預設情況下,列舉成員的值是整數。第一個列舉值的值為 0,每個後續條目遞增 1。此外,您可以顯式地將值設定為您選擇的整數。

enum Protocol{
   TCP = 0,
   IP = 50,
   UDP = 100
}

無法在列舉型別內定義方法。但是,使用擴充套件方法,您仍然可以向列舉型別新增行為。

列舉的一個重要特性是它在執行時聲明瞭一組可能的常數值,並使程式碼更易於閱讀。例如,您可以使用列舉替換布林值,如下所示。

SetState(true);
// vs.
SetState(DeviceState.On);

更新於:2021年5月19日

1000+ 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.