C# 中的属性(Property)
                           
天天向上
发布: 2025-04-19 10:10:03

原创
13 人浏览过

本章节全面、深入地讲解 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;
}

✔️ 工具推荐:使用 ILSpydotPeek 可查看底层实现。


五、属性高级用法

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.nameobj.Nameobj.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]

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *