.NET 執行期保證所有記憶體初始化為零。實值型別無法阻止使用者建立全零實例(new MyStruct()、陣列元素、欄位預設值)。設計實值型別時,必須讓零值代表合法、有意義的狀態。
// 錯誤:無零值定義
enum Planet { Mercury = 1, Venus = 2, Earth = 3 }
// Planet p = new Planet(); // p = 0,非合法值!
// 正確:定義零值
enum Planet { None = 0, Mercury = 1, Venus = 2, Earth = 3 }
Planet p = new Planet(); // p = None,合法預設值
[Flags]
enum Styles { None = 0, Flat = 1, Sunken = 2, Raised = 4 }
// 位元測試:if ((flag & Styles.Flat) != 0) — 若 Flat=0 永遠 false!
string 等參考欄位預設為 null。無法在初始化運算式指定非 null 值(會對所有實例共用同一物件)。解法:屬性封裝預設值:
struct LogMessage
{
private int _level;
private string _msg;
public string Message
{
get => _msg ?? string.Empty; // null 時回傳空字串
set => _msg = value;
}
}
內部邏輯統一存取 Message 屬性,將 null 邊界條件局部化。屬性存取器極易內聯,零效能損失。
struct ObservationData
{
Planet _planet;
double _magnitude;
public ObservationData(Planet planet, double mag)
{
_planet = planet;
_magnitude = mag;
}
}
// 但預設建構函式仍可呼叫:new ObservationData() → _planet = None, _magnitude = 0
// 零值合法,程式不會進入無效狀態
None、0、string.Empty)。null 預設值。