結構(struct)語法與類別幾乎相同,僅將 `class` 改為 `struct`。適用場景:小型資料結構、頻繁建立/銷毀、需值語意(如座標點、矩陣、日期時間)。
| 特性 | class(參考型別) | struct(值型別) |
|---|---|---|
| 儲存位置 | Managed Heap | Stack / Inline in containing type |
| 指派行為 | 參考複製 | 值複製 |
| 繼承 | 支援單一繼承 | 不可繼承(隱性 sealed) |
| 預設建構函式 | 開發者可自訂無參建構式 | 編譯器強制提供,不可自訂無參建構式 |
| Null 能力 | 可為 null | 不可為 null(除非用 Nullable<T>) |
| 效能 | GC 壓力大、間接存取 | 零 GC、記憶體局部性佳 |
關鍵字 partial 允許將同一個類別、介面、結構拆分至多個原始檔。編譯時自動合併。
// File: Person.Core.cs
public partial class Person {
public string Name { get; set; }
public void SayHello() => Console.WriteLine($"Hi, {Name}");
}
// File: Person.Serialization.cs
public partial class Person {
public string ToJson() => $"{{\"Name\":\"{Name}\"}}";
public static Person FromJson(string json) { /* ... */ }
}
所有 .NET 型別(含值型別經 boxing)隱含繼承 System.Object,直接獲得以下虛擬/非虛擬方法:
| 方法 | 用途 | 建議覆寫? |
|---|---|---|
ToString() | 物件人類可讀表示 | ✅ 強烈建議(除非極簡單型別) |
Equals(object) | 值相等比較 | 值型別 ✅ / 參考型別視語意 |
GetHashCode() | 雜湊碼(Dictionary/HashSet 鍵值) | 覆寫 Equals 時必覆寫 |
GetType() | 取得執行階段 Type 物件 | 不可覆寫 |
MemberwiseClone() | 淺層複製 | protected,可內部使用 |
Finalize() | 解構子語法 `~Class()` | 僅非託管資源清理需實作 |
public struct Point3D {
public int X, Y, Z;
public override string ToString() => $"({X}, {Y}, {Z})";
}
// 使用
var p = new Point3D { X = 1, Y = 2, Z = 3 };
Console.WriteLine(p); // 輸出 (1, 2, 3)
掌握結構的值語意、部分類別的組織藝術、Object 的基礎契約,是邁向 C# 專家的關鍵里程碑。