You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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;触发编译错误,需通过封装手段将私有成员的访问限制在所属实例范围内。

修改方案

通过私有嵌套类封装原私有成员,阻断其他实例的直接访问路径:

  1. 创建私有嵌套类AgeHolder,专门封装单个实例的年龄数据
  2. 将原_age字段替换为AgeHolder类型的实例,仅当前Person实例持有该引用
  3. 移除原_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:19:02