# 成员属性
概念：
- 属性（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` 参数传入

#封装
#核心
