частная переменная по-прежнему доступна из другого класса в C#

#class #variables #set #private

#класс #переменные #установить #Частное

Вопрос:

У меня есть файл .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; }
    }
}
  

Мой вопрос касается переменной «Points» в классе PointLayer.
Несмотря на то, что у меня есть модификатор private set; , следующая строка в PointCloudObject не является проблемой pointLayer.Points[point.Location_x,point.Location_y] ; .

почему это?

Ответ №1:

Модификатор ссылается на массив точек, а не на отдельные элементы массива. Класс PointCloud_Object не может назначить новый массив для PointLayer.Переменная Points, но она может манипулировать отдельными элементами массива.

Комментарии:

1. Ах, спасибо! Есть ли способ защитить элементы внутри массива, чтобы их нельзя было изменять извне класса?

2. Я не думаю, что вы можете защитить элементы напрямую, пока открыт массив. Одним из вариантов было бы сделать массив закрытым и предоставить метод, который возвращает отдельные элементы. Другим вариантом может быть использование альтернативной структуры данных вместо массива (возможно, ReadOnlyCollection будет соответствовать вашим потребностям).