Files
My-Notes/笔记/CSharp/核心/成员属性.md
T
2026-06-21 09:51:55 +08:00

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` 参数传入
#封装
#核心