仍然可以从 C# 中的另一个类访问私有变量

Posted

技术标签:

【中文标题】仍然可以从 C# 中的另一个类访问私有变量【英文标题】:private variable is still accessible from another class in C# 【发布时间】:2020-12-20 16:21:47 【问题描述】:

我有一个如下所示的 .cs 文件

namespace TarkovMapper.ClassObjects

    class PointCloud_Object
    
        public void AddPoint(PointEntry_Object point)
        
            PointLayer pointLayer = LoadPointLayer(path);
            pointLayer.Points[point.Location_x,point.Location_y]++;
        
        private PointLayer LoadPointLayer(string path)
        
            if (!File.Exists(path)) return new PointLayer(this.Width, this.Height);
            Stream s = File.OpenRead(path);
            BinaryFormatter b = new BinaryFormatter();
            PointLayer returnObject = (PointLayer) b.Deserialize(s);
            s.Close();
            return returnObject;
        
    
    [Serializable]
    class PointLayer
    
        public PointLayer(int width, int height)
        
            this.Points = new int[width, height];
        
        public int[,] Points  get; private set;  // <- private set!!!
        public int Maximum  get; private set; 
    

我的问题是关于 PointLayer 类中的变量“点”。 尽管我有修改器 private set;,但 PointCloudObject 中的以下行没有问题 pointLayer.Points[point.Location_x,point.Location_y]++;

这是为什么呢?

【问题讨论】:

【参考方案1】:

修饰符指的是 Points 数组,而不是数组的各个元素。 PointCloud_Object 类无法将新数组分配给 PointLayer.Points 变量,但它可以操作单个数组元素。

【讨论】:

啊,谢谢!有没有办法可以保护 Array 内的元素,使其不能从 Class 外部修改? 我不认为只要数组暴露就可以直接保护元素。一种选择是将数组设为私有并提供一种返回单个元素的方法。另一种选择可能是使用替代数据结构而不是数组(也许 ReadOnlyCollection 会满足您的需求)。

以上是关于仍然可以从 C# 中的另一个类访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Access VBA 中的另一个私有子获取私有子中声明的变量的值

从 C++ 中的类访问私有变量

为啥我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制]

C ++通过访问器函数返回私有二维数组

如何访问其子类中的类的私有变量?

从子类访问父类的私有实例变量?