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

Effective C# 原則 8:確保實值型別的零值為有效狀態

     編輯:關於C#

.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 列舉更嚴格:零值必須代表「無旗標」

[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)。
  • Flags 列舉零值 = 無旗標組合。
  • 參考欄位用屬性統一處理 null 預設值。
  • 提供參數化建構函式引導完整初始化,但接受預設建構函式存在。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved