首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 8:確保 0 對實值型別是有效狀態(下)

     編輯:關於C語言

列舉型別必須包含 0 值

// ❌ 錯誤:無 0 值
public enum Planet
{
    Mercury = 1, Venus = 2, Earth = 3, Mars = 4,
    Jupiter = 5, Saturn = 6, Neptune = 7, Uranus = 8, Pluto = 9
}
Planet p = new Planet(); // p = 0 → 無效值!

// ✅ 正確:加入 None = 0
public enum Planet
{
    None = 0,
    Mercury = 1, Venus = 2, Earth = 3, Mars = 4,
    Jupiter = 5, Saturn = 6, Neptune = 7, Uranus = 8, Pluto = 9
}
Planet p = new Planet(); // p = Planet.None → 有效預設值

提供明確建構函式引導正確初始化

public readonly struct ObservationData
{
    public Planet Target { get; }
    public double Magnitude { get; }

    public ObservationData(Planet target, double magnitude)
    {
        Target = target;
        Magnitude = magnitude;
    }
}

// 使用
var obs = new ObservationData(Planet.Mars, -1.5); // 明確初始化
// 預設 new ObservationData() 仍會產生 Target=None, Magnitude=0

Flags 列舉的特殊規則

[Flags]
public enum Styles
{
    None = 0,      // 必須為 0
    Flat = 1,      // 2^0
    Sunken = 2,    // 2^1
    Raised = 4     // 2^2
}

// 位元運算檢查
if ((style & Styles.Flat) != 0) // 若 Flat=0 則永遠 false!
    DoFlatThings();

None = 0 代表「無旗標」,位元運算才正確運作。

核心原則

  1. 所有實值型別(含列舉)預設值為 0
  2. 設計型別時,確保 0 是有效、合理的預設狀態
  3. 列舉必須定義 None = 0 或等價語意值
  4. Flags 列舉強制要求 None = 0
  5. 提供建構函式/工廠方法引導明確初始化,但無法阻止 new T()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved