在 C# 中,{ get; set; } 是 自動屬性(Auto-Implemented Property) 的語法糖,用于快速定義屬性的讀寫操作。以下是詳細解釋:
需手動定義私有字段和公開屬性:
public string Name { get; set; }
- 本質:編譯器自動生成隱藏的私有字段,以及對應的
get 和 set 方法。
public string CreatedAt { get; } = DateTime.Now.ToString();
public string Password { private get; set; }
public string Name { get; private set; }
| 特性 | 字段(Field) | 屬性(Property) |
| 語法 |
private string _name; |
public string Name { get; set; } |
| 訪問控制 |
直接訪問(通常為私有) |
通過 get/set 方法間接訪問 |
| 封裝性 |
低(暴露實現細節) |
高(可隱藏內部實現) |
| 擴展性 |
難(修改字段影響所有調用處) |
易(可在 get/set 中添加邏輯) |
private int _age;
public int Age
{
get => _age;
set
{
if (value < 0) throw new ArgumentException("年齡不能為負數");
_age = value;
}
}
public string FullName => $"{FirstName} {LastName}";
private List<string> _items = new();
public string this[int index]
-
優先使用自動屬性:
若無特殊邏輯,直接用 { get; set; } 簡化代碼。
-
避免公開字段:
始終通過屬性暴露數據,保持封裝性。
-
在 set 中添加驗證:
例如檢查參數范圍、權限控制等。
-
使用 init 實現初始化后只讀:
public string Email { get; init; }
能。JSON 序列化工具(如 System.Text.Json)可正常處理自動屬性:
var person = new { Name = "張三", Age = 20 };
string json = JsonSerializer.Serialize(person);
需在基類中聲明為 virtual,子類用 override:
public class Animal
{
public virtual string Sound { get; set; } = "默認叫聲";
}
public class Dog : Animal
{
public override string Sound { get; set; } = "汪汪";
}
{ get; set; } 是 C# 中定義自動屬性的語法,它隱藏了私有字段,讓代碼更簡潔。屬性相比字段提供了更好的封裝性和擴展性,是面向對象編程的重要組成部分。