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

C# 建立常數與原子值型別(一)

     編輯:關於C語言

背景

基於《Effective C#》第 7 項:建立具備常數性與原子性的值型別。

從類別到結構

設計郵遞地址型別 Address,包含 Province、City、Zip(需驗證 6 位數字)。

初版:類別實作

public class Address {
    private string _province, _city, _zip;
    public string Province { get => _province; set => _province = value; }
    public string City { get => _city; set => _city = value; }
    public string Zip {
        get => _zip;
        set { CheckZip(value); _zip = value; }
    }
    private void CheckZip(string v) {
        if (!Regex.IsMatch(v, @"^\d{6}$")) throw new Exception("Zip 格式錯誤");
    }
    public override string ToString() => $"{Province} {City} {Zip}";
}

問題分析

  • 類別為參考型別,易產生別名副作用
  • 可變性導致不可預期的狀態變更
  • 缺乏值型別的語意:地址應為不可變的原子值

改進方向

  1. 改為 struct(值型別)
  2. 移除 setter,改為唯讀屬性
  3. 建構函式驗證並初始化所有欄位
  4. 實作 IEquatable<Address>、覆寫 Equals/GetHashCode

下篇將展示完整的值型別實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved