——掌握访问器权限控制,代码更安全!
📌 核心规则速览
在C#中,属性和索引器的 get 和 set 访问器可以有不同的访问级别,但需遵循以下规则:
- 必须成对存在
只有同时包含 get 和 set 的成员(属性/索引器)才能为访问器单独设置修饰符。 - 仅限一个修饰符
两个访问器中,只能有一个 设置访问修饰符,另一个默认与成员本身的访问级别一致。
- 更严格的限制
访问器的修饰符必须比成员的整体访问级别 更严格。例如: - 成员为 public → 访问器可用 internal/protected/private
- 成员为 protected → 访问器只能为 private
🛠 经典应用场景
场景:允许外部读取,禁止外部修改
通过将 set 设为 private,实现“只读属性”的效果:
class Person
{public string Name { get; private set; } // 外部可读,仅内部可写public Person(string name) => Name = name;
}// 使用示例
var p = new Person("Alice");
Console.WriteLine(p.Name); // 允许
p.Name = "Bob"; // 编译错误!无法外部修改
🔍 为什么需要这样做?
- 封装性
隐藏内部数据修改逻辑,防止外部随意篡改。 - 安全性
关键数据(如用户ID)通过私有 set 保护,避免非法赋值。 - 灵活性
可在 private set 中添加验证逻辑,确保数据合法性。
❗ 常见误区
错误1:两个访问器都加修饰符
public string Name { get; public set; } // 编译错误!
错误2:修饰符不够严格
protected int Age { get; internal set; } // 错误!internal 比 protected 宽松
📊 访问级别严格性排序
- 从宽松到严格:
public → internal → protected → protected internal → private
记住口诀:
“成员权限是天花板,访问器只能向下钻”
💡 实战建议
优先使用自动属性
{ get; private set; } 写法简洁,避免手动实现字段。
结合构造函数初始化
通过构造方法强制赋初值,确保对象状态有效。
单元测试中的技巧
若需测试私有 set 逻辑,可用 [InternalsVisibleTo] 向测试程序集暴露内部成员。
掌握访问器修饰符的权限控制,能让你的代码更健壮、更安全!下次写属性时,不妨试试 private set,感受封装的魅力吧! 🚀