| 特性 | struct (實值型別) | class (參考型別) |
|---|---|---|
| 記憶體配置 | 堆疊 / 內嵌陣列元素 | 堆積 (GC 管理) |
| 指派語意 | 複製整個實例 | 複製參考 |
| 繼承 | 不可繼承 (隱性 sealed) | 支援繼承 |
| 預設建構函式 | 編譯器自動產生 (全零初始化) | 可自訂 |
| Null 能力 | 不可為 null (除非 Nullable<T>) | 可為 null |
| 介面實作 | 支援 | 支援 |
符合所有條件才考慮 struct:
// 不可變結構體 (C# 7.2+ readonly struct)
public readonly struct Point3D : IEquatable {
public double X { get; }
public double Y { get; }
public double Z { get; }
public Point3D(double x, double y, double z) {
X = x; Y = y; Z = z;
}
// 覆寫 Equals/GetHashCode 避免反射開銷
public bool Equals(Point3D other) => X == other.X && Y == other.Y && Z == other.Z;
public override bool Equals(object obj) => obj is Point3D p && Equals(p);
public override int GetHashCode() => HashCode.Combine(X, Y, Z);
public static bool operator ==(Point3D a, Point3D b) => a.Equals(b);
public static bool operator !=(Point3D a, Point3D b) => !a.Equals(b);
// in 參數避免複製
public double DistanceTo(in Point3D other) {
double dx = X - other.X, dy = Y - other.Y, dz = Z - other.Z;
return Math.Sqrt(dx*dx + dy*dy + dz*dz);
}
}
// 可變結構體 (謹慎使用)
public struct Counter {
private int _value;
public int Value => _value;
public void Increment() => _value++; // 會修改副本,若非 ref 傳遞易產生 Bug
}
Point3D[] 連續記憶體,Cache 友善,優於 Point3D[] 類別陣列in / ref / Span<T>readonly struct 允許編譯器優化防禦性複製IEquatable<T> 避免裝箱比較point.X = 1 編譯錯誤 (修改副本)list[0].X = 1 無效 (List 索引器回傳副本)IEquatable<Point3D> eq = point; eq.Equals(other) 裝箱

