如何限制C#同类实例间的私有成员访问?
让C#类私有成员仅能被所属实例访问的实现方法
原代码示例(同类实例可互相访问私有成员):
class Person { public string Name; private Person? _brother; private int _age; public Person(string name, int age, Person? brother = null) { Name = name; _age = age; _brother = brother; } public int GetAgeOfBrother() { if (_brother is null) { return -1; } return _brother._age; // 当前同类实例可访问彼此私有成员,无编译错误 } } var p1 = new Person("Bob", 30); var p2 = new Person("Alice", 35, p1); Console.WriteLine(p2.GetAgeOfBrother());
C#的私有访问权限是类级别而非实例级别,因此同类的不同实例之间可以互相访问私有成员。要让return _brother._age;触发编译错误,需通过封装手段将私有成员的访问限制在所属实例范围内。
修改方案
通过私有嵌套类封装原私有成员,阻断其他实例的直接访问路径:
- 创建私有嵌套类
AgeHolder,专门封装单个实例的年龄数据 - 将原
_age字段替换为AgeHolder类型的实例,仅当前Person实例持有该引用 - 移除原
_age字段,使其他实例无法通过_brother._age直接访问年龄
修改后的代码:
class Person { public string Name; private Person? _brother; // 用私有嵌套类实例封装年龄 private readonly AgeHolder _ageHolder; // 私有嵌套类,仅当前类可访问,用于封装单个实例的年龄 private class AgeHolder { internal int Age { get; } public AgeHolder(int age) { Age = age; } } public Person(string name, int age, Person? brother = null) { Name = name; _ageHolder = new AgeHolder(age); _brother = brother; } // 仅当前实例能获取自身年龄 public int GetOwnAge() { return _ageHolder.Age; } public int GetAgeOfBrother() { if (_brother is null) { return -1; } // 原代码的return _brother._age;会触发编译错误:Person不包含_age的定义 // 若尝试访问_brother._ageHolder.Age,也会触发错误:无法访问私有类AgeHolder的成员 return -1; } } var p1 = new Person("Bob", 30); var p2 = new Person("Alice", 35, p1); Console.WriteLine(p2.GetAgeOfBrother());
修改后,原代码中的return _brother._age;会直接触发编译错误,从而实现了私有成员仅能被所属实例访问的效果。
内容的提问来源于stack exchange,提问作者AracKnight
相关产品推荐
相关产品推荐

