C# 2.0時代,為實現封裝需手寫私有字段+公共屬性:
public class UserInfo
{
private string _userName;
private string _passWord;
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
public string PassWord
{
get { return _passWord; }
set { _passWord = value; }
}
}
雖VS提供Encapsulate Field重構,但屬性多時代碼膨脹明顯,維護成本高。
編譯器自動生成隱私備字段,語法極簡:
public class UserInfo
{
public string UserName { get; set; }
public string PassWord { get; set; }
}
var user = new UserInfo();
user.UserName = "test";
user.PassWord = "test";
Console.WriteLine(user.UserName); // 輸出 test
public class Entity
{
public string Id { get; private set; } // 外部不可寫
public Entity(string id) => Id = id; // 構造函數內可賦值
public void ResetId(string newId) => Id = newId; // 類內部可寫
}
private set實現「外部只讀、內部可寫」,比readonly字段更靈活(支持延遲初始化、邏輯控制)。
get與set(可用訪問修飾符差異化)。Attribute(需改用傳統寫法)。<UserName>k__BackingField)。自動屬性是C# 3.0最受歡迎的「語法糖」,大幅提升代碼信噪比。