C# 属性(Property)完全指南:从原理到实践
C#属性是连接字段与外部调用的桥梁,通过get和set访问器实现数据的封装与安全访问。掌握访问器约束、接口兼容性以及继承控制规则,有助于写出更符合OOP规范的代码。
一、属性的基本原理与结构
在C#中,属性并不直接存储数据,而是通过访问器(Accessors)来控制私有字段的读取与写入。一个完整的属性通常包含私有字段支持和公共访问方法。
第1步:定义Get和Set访问器
目的:理解如何通过访问器控制字段读写。
操作:
get访问器用于返回字段值或计算结果,必须包含return或throw语句。set访问器类似于返回类型为void的方法,使用隐式参数value来接收赋值。
代码如下:
private int dd;
public int DD
{
get { return dd * 3; }
set { dd = value / 3; }
}
// 自动属性示例(无逻辑时)
public string Name { get; set; }
若省略 set,属性变为只读;省略 get,属性变为只写。现代开发推荐优先使用 自动属性,除非需要附加验证逻辑。
二、访问修饰符的限制规则
属性支持 public, private, protected, internal 和 protected internal 修饰。但访问修饰符有严格的层级要求:
第2步:确保访问器级别比属性更严格
目的:避免编译错误,保证封装逻辑正确。
核心规则:
- 层级原则:访问器的可访问级别必须等于或比属性的级别更严格(例如:
public property内部的private get是合法的)。 - 共存条件:只有当属性同时拥有
get和set时,才允许单独对其中一个访问器添加修饰符。如果只有一个访问器,则它自动继承属性的修饰符。 - 接口限制:接口中的所有成员默认隐式为公共的,因此在声明接口属性时不能添加任何访问修饰符。
三、特殊场景下的属性处理
第3步:处理静态与抽象/虚拟属性
操作说明:
- 静态属性 (
static):通过类名访问,适用于全局计数器或配置项。 - 虚属性 (
virtual):允许派生类使用override关键字重写行为。重写的访问器修饰符(如 get/set)必须与原属性完全一致。 - 抽象属性 (
abstract):仅在抽象类中使用,不包含实现体,必须由派生类强制实现。 - 密封属性 (
sealed):通常配合 override 使用,防止后代类继续重写该属性。
第4步:应对继承冲突(Override vs New)
目的:解决子类同名属性的覆盖问题。
操作:
override:替换基类的虚/抽象功能,保持多态性。new:隐藏基类的属性,不再具备多态效果。当基类未将属性标记为 virtual/abstract 时使用此关键字消除警告。
四、接口实现中的属性适配
在显式实现接口时,需特别注意接口的公开性。如果接口定义了带有 get 但无 set 的属性,而类希望提供写入能力,可以在派生实现中将 set 设为受保护(protected),从而增加功能的灵活性而不破坏接口契约。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













