Тот факт, что ReadOnlyCollection
неизменяем, означает, что коллекцию нельзя изменить, т.е. нельзя добавлять или удалять объекты из коллекции. Это не означает, что содержащиеся в нем объекты неизменяемы.
Эта статья Эрика Липперта, объясняет, как работают разные виды неизменяемости. По сути, ReadOnlyCollection
- это неизменный фасад, который может читать базовую коллекцию (_myDataList
), но не может ее изменять. Однако вы все равно можете изменить базовую коллекцию, поскольку у вас есть ссылка на _myDataList
, выполнив что-то вроде _myDataList[0] = null
.
Кроме того, объекты, возвращаемые ReadOnlyCollection
, совпадают с объектами, возвращаемыми _myDataList
, то есть this._myDataList.First() == this.MyReadOnlyList.First()
(с LINQ
). Это означает, что если объект в _myDataList
является изменяемым, то и объект в MyReadOnlyList
тоже.
Если вы хотите, чтобы объекты были неизменными, вы должны соответствующим образом их спроектировать. Например, вы можете использовать:
public struct Point
{
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
// In C#6, the "private set;" can be removed
public int X { get; private set; }
public int Y { get; private set; }
}
вместо:
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
Изменить: в этом случае, как отметил Ян Голдби, ни одна из структур не позволяет вам изменять свойства элементов в коллекция. Это происходит потому, что структуры являются типами значений, и когда вы обращаетесь к элементу, коллекция возвращает копию значения. Вы можете изменять свойства типа Point
, только если это класс, что будет означать, что будут возвращены ссылки на фактические объекты, а не на копии их значений.
person
Fernando Matsumoto
schedule
07.09.2015