89 lines
1.7 KiB
Markdown
89 lines
1.7 KiB
Markdown
# 成员属性
|
|
概念:
|
|
- 属性(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` 参数传入
|
|
|
|
#封装
|
|
#核心
|