Files
My-Notes/笔记/CSharp/核心/成员属性.md
T

89 lines
1.7 KiB
Markdown
Raw Normal View History

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