C# 中的属性(Property)
本章节全面、深入地讲解 C# 中的属性(Property),并附带详实的语法、机制分析、使用场景、进阶技巧,以及真实案例。
一、什么是 C# 属性(Property)
属性(Property) 是 C# 中用于封装字段(Field)的一种成员机制,让你可以像访问字段一样使用 getter 和 setter,而不直接暴露字段本身。
它本质上是方法(get/set)的语法糖,属于 面向对象封装原则 的体现。
二、基本语法结构
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
等价于:
public string Name { get; set; }
这是 C# 中的 自动属性(Auto-Implemented Property)。
三、属性访问器说明
| 访问器 | 描述 |
|---|---|
get | 获取属性的值 |
set | 设置属性的值 |
你也可以设置只读或只写:
public string Name { get; } // 只读属性
public string Password { private get; set; } // 公共 set,私有 get
四、属性背后的 IL 本质
自动属性在 IL 中会自动生成一个隐藏字段:
// 编译器背后实现
private string <Name>k__BackingField;
public string Name
{
get => <Name>k__BackingField;
set => <Name>k__BackingField = value;
}
✔️ 工具推荐:使用 ILSpy 或
dotPeek可查看底层实现。
五、属性高级用法
1️⃣ 表达式体属性(C# 6+)
public int Age => DateTime.Now.Year - BirthYear;
仅只读可用,适用于简单逻辑。
2️⃣ 私有 set / 初始化器
public string Name { get; private set; } = "默认值";
3️⃣ 属性校验(带逻辑)
private int age;
public int Age
{
get => age;
set
{
if (value < 0) throw new ArgumentException("年龄不能为负数");
age = value;
}
}
4️⃣ 静态属性
public static string AppName { get; set; } = "MyApp";
5️⃣ 索引器属性(类似数组)
public string this[int index]
{
get => items[index];
set => items[index] = value;
}
六、属性 VS 字段 VS 方法
| 特性 | 字段(Field) | 属性(Property) | 方法(Method) |
|---|---|---|---|
| 封装性 | ❌ 低 | ✅ 高 | ✅ |
| 访问形式 | obj.name | obj.Name | obj.GetName() |
| 可继承性 | ❌ 限 | ✅ 可重写 | ✅ |
| 数据绑定支持 | ❌ 无 | ✅ 强 | ✅ |
七、实际场景案例
✅ 案例:实体类封装 + 验证
public class User
{
private string email;
public string Email
{
get => email;
set
{
if (!value.Contains("@")) throw new Exception("Email 不合法");
email = value;
}
}
}
🔍 用属性而不是字段,可以做到集中校验、易于调试、绑定友好。
✅ 案例:结合接口实现只读暴露
public interface IUser
{
string Username { get; }
}
public class User : IUser
{
public string Username { get; private set; }
}
八、权威参考链接
九、推荐拓展学习
| 内容 | 说明 |
|---|---|
| 🔧 属性 + 反射 | 结合 PropertyInfo 动态获取值、设置值(如序列化、ORM) |
| 🔐 属性 + Attribute | 属性 + 自定义特性,做字段级权限控制 |
| 🏗️ 属性注入 | 属性注入在 DI 容器中(如 [Inject]) |
更多详细内容请关注其他相关文章!