#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 будет соответствовать вашим потребностям).