C# 2.0 傳統寫法:
private int _one;
public int One
{
get { return _one; }
set { _one = value; }
}
C# 3.0 自動屬性:
public int One { get; set; } // 編譯器自動生成隱私備字段
public string Name { get; private set; } // 外部不可寫
內部賦值合法:
public class EDClass
{
public string Name { get; private set; }
public EDClass() => Name = "QQ";
public void SetName() => Name = "QQ"; // 類內部可寫
}
外部賦值編譯錯誤:
var cls = new EDClass();
cls.Name = "QQ"; // 錯誤:set 訪問器不可訪問
不能在自動屬性上直接掛載Attribute**:
// 錯誤示範
[SomeAttribute]
public string Name { get; set; } // Attribute實際作用於隱藏的備字段,無法控制
若需Attribute控制備字段,必須改用傳統寫法:
[SomeAttribute]
private string _name;
public string Name { get => _name; set => _name = value; }
<PropertyName>k__BackingField命名的私有字段。get/set方法直接訪問該字段,無額外邏輯。自動屬性極大減少樣板代碼,private set優雅實現「外部只讀、內部可寫」,但Attribute場景需退回傳統寫法。理解編譯器生成機制有助於調試與序列化場景排查。