public struct Address
{
private readonly string _province;
private readonly string _city;
private readonly string _zip;
public Address(string province, string city, string zip)
{
_province = province;
_city = city;
_zip = zip;
CheckZip(zip); // 驗證格式
}
public string Province => _province;
public string City => _city;
public string Zip => _zip;
private void CheckZip(string zip)
{
if (!System.Text.RegularExpressions.Regex.IsMatch(zip, @"^\d{6}$"))
throw new ArgumentException("郵遞區號必須為 6 位數字");
}
public override string ToString() => $"Province: {_province}, City: {_city}, Zip: {_zip}";
}
readonly 欄位:編譯期保證建構後不可變更。get):公開介面不暴露設值管道。
var a = new Address("陝西", "西安", "710068");
try {
a = new Address("青島", "山東", "22233"); // 驗證失敗拋出例外
} catch { }
Console.WriteLine(a); // 輸出:Province: 陝西, City: 西安, Zip: 710068 (原物件未變)
重新指派變數 a 為新實例,若建構失敗,原變數仍保持舊值,狀態一致性獲得保障。