# 成员属性 概念: - 属性(Property)不是字段本身,而是==对字段的访问入口== - 它看起来像变量,用起来也像变量,但本质上是特殊方法 - 属性常用于:读取、赋值、校验、限制访问 通常用法: 1. 保护字段,不让外部随便乱改 2. 在赋值或读取时加入逻辑 3. 做“只能读”“只能类内改”“初始化后不可改”等控制 完整语法: ```csharp class Person { private string name; public string Name { get { return name; } set { name = value; } } } ``` 案例: ```csharp class Person { private int age; public int Age { get { return age; } set { if (value < 0) { age = 0; return; } age = value; } } } Person p = new Person(); p.Age = -5; Console.WriteLine(p.Age); // 0 ``` 说明: - `get` 负责取值 - `set` 负责赋值 - `set` 里的 `value` 表示外部传入的新值 自动属性: ```csharp public string Name { get; set; } public float Height { get; private set; } public string Id { get; init; } ``` 补充: - 自动属性会由编译器生成隐藏的 backing field - `private set` 表示外部能读、类内部能改 - `init` 表示只能在创建对象时赋值 注意: 1. ==`get` 中如果要返回值,就必须 `return`== 2. 属性本身的访问级别看属性前面的修饰符 3. `get` / `set` 可以单独再加更严格的访问修饰符,但不能比属性本身更开放 4. 只有 `get` 没有 `set` 时是只读属性 5. 只有 `set` 没有 `get` 时是只写属性,但实际开发里很少这样写 6. 属性不是普通变量,所以通常不能当 `ref` / `out` 参数传入 #封装 #核心