C# 属性访问器 get 与 set 详解及封装价值

林见深
林见深
发布时间:2026-10-14 | 5人浏览过
原创

在 C# 开发中,理解 get 和 set 访问器是掌握属性封装的关键。本文详细解释这两个关键字的执行逻辑,并通过实际案例说明为何应优先使用属性而非直接暴露公共字段,以实现数据校验、副作用处理及后续代码的易维护性。

结果或目标:理解属性的访问机制

C# 属性是一种成员,它提供灵活的机制来读取、写入或计算私有字段的值。get 访问器用于返回字段值或计算结果,set 访问器用于接收新值并进行存储。通过合理配置这两者,开发者可以在不改变接口的前提下增加逻辑判断和业务规则。

准备条件:基本的类定义环境

为了演示属性的工作原理,我们需要一个包含私有字段和公共属性的类结构。以下是一个基础的汽车类示例,其中包含私有字段 color 和公共属性 Color:

复制代码
public class Car
{
    private string color; // 私有字段,隐藏内部状态

    public string Color
    {
        get
        {
            return color;
        }
        set
        {
            color = value; // value 是隐式参数,代表传入的新值
        }
    }
}

真实操作顺序:get 与 set 的执行逻辑

第1步:理解 get 访问器的读取行为

目的:安全地获取对象的状态信息。
入口:读取属性值时自动触发,例如 Console.Write(car.Color)。
动作:get 访问器体类似于无参数方法,必须返回属性类型的值。它可以直接返回私有字段,也可以执行复杂的计算逻辑。

示例:带默认值的读取 如果字段未初始化,可以返回特定默认值:

public string Name 
{
    get 
    {
        // 若 name 为 null,则返回 "NA",避免返回空引用
        return name != null ? name : "NA";
    }
}

重要警告:严禁在 get 中更改对象状态(如自增变量),这会导致不可预测的副作用。

第2步:理解 set 访问器的写入行为

目的:在赋予新值前后执行必要的业务逻辑或校验。
入口:对属性赋值时自动触发,例如 car.Color = "Red"。
动作:set 访问器类似于返回 void 的方法,接收一个名为 value 的隐式参数,其类型与属性相同。

示例:基础赋值

set 
{
    // 将传入的 value 赋值给私有字段
    color = value;
}

扩展示例:带有逻辑处理的赋值 在 ASP.NET WebForms 中,常利用 set 将状态保存到 ViewState:

set
{
    this.viewState["color"] = value; // 同时保存状态
}

第3步:根据访问器组合分类属性

  • 只读属性:仅包含 get。外部无法修改,适用于需要保护内部数据不被篡改的场景。
  • 只写属性:仅包含 set。极少使用,通常用于日志记录或监听器模式。
  • 读写属性:同时包含 get 和 set。最常见的属性形式。

完成判断与核心价值:为何不用公共字段?

很多初学者会问:既然最终都要操作私有字段,为什么不直接把字段设为 public?直接使用 get/set 的核心优势在于封装与可维护性。

1. 支持副作用与业务逻辑扩展

假设需求变更:当汽车颜色改变时,需要重新计算价格并重绘界面。

  • 若使用公共字段:所有直接访问 public string Color 的代码都不会触发任何逻辑更新,导致系统状态不一致(“老板让你改这个,你会死定”)。
  • 若使用属性:只需修改 set 访问器内部的代码,添加重绘和计算逻辑即可。所有调用 Car.Color = ... 的地方自动获得新功能,无需改动其他调用点。

2. 提升代码的可维护性

如果一个内部变量名从 a 改为 b:

  • 公共字段:需要在全局搜索并修改上千处引用。
  • 公共属性:只需修改属性内部对字段的引用,外部调用代码保持不变。

3. 隐藏内部实现细节

通过属性,你可以完全控制数据的读写方式。例如,可以通过重写属性访问器,让 get 从数据库或缓存中动态获取数据,而外部代码依然以为这是一个简单的字段,实现了接口的稳定性与实现的灵活性分离。

原文有依据的排错:派生类中的属性隐藏

在继承关系中,如果派生类定义了与基类同名的属性,默认情况下编译器会发出警告。若要显式隐藏基类属性,需使用 new 修饰符。

public class BaseClass 
{
    public string Name { get; set; }
}

public class DerivedClass : BaseClass 
{
    // 使用 new 修饰符明确隐藏基类属性
    public new string Name { get; set; }
}

访问时需注意强制类型转换以区分当前访问的是哪个类的属性:

DerivedClass d1 = new DerivedClass();
d1.Name = "John";              // 调用派生类属性
((BaseClass)d1).Name = "Mary"; // 调用基类属性

简要总结

C# 的 get 和 set 不仅仅是字段的包装器,它们是实施封装原则、执行数据校验、处理副作用以及确保代码长期可维护性的核心工具。始终优先使用属性而非公共字段,是编写高质量 C# 代码的基础习惯。

以上就是 C# 属性中 get 与 set 的详细解析,更多关于 C# 面向对象编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表