Я думаю, что Вы на правильном пути -
Чтобы быть неизменными, все Ваши свойства и поля должны быть только для чтения. И объекты в любом списке должны самостоятельно быть неизменными.
можно сделать свойство списка только для чтения следующим образом:
public class MyClass
{
public MyClass(..., IList<MyType> items)
{
...
_myReadOnlyList = new List<MyType>(items).AsReadOnly();
}
public IList<MyType> MyReadOnlyList
{
get { return _myReadOnlyList; }
}
private IList<MyType> _myReadOnlyList
}
Кроме того, имейте в виду что:
public readonly object[] MyObjects;
не неизменно, даже если это отмечено с ключевым словом только для чтения. Можно все еще изменить ссылки/значения отдельного массива индексным средством доступа.
Используйте ReadOnlyCollection
класс. Это расположено в System.Collections.ObjectModel
пространство имен.
На чем-либо, что возвращает Ваш список (или в конструкторе), устанавливает список как набор только для чтения.
using System.Collections.ObjectModel;
...
public MyClass(..., List<ListItemType> theList, ...)
{
...
this.myListItemCollection= theList.AsReadOnly();
...
}
public ReadOnlyCollection<ListItemType> ListItems
{
get { return this.myListItemCollection; }
}
Другая опция состояла бы в том, чтобы использовать шаблон "посетитель" вместо того, чтобы представить любые внутренние наборы вообще.
Используя ReadOnlyCollection ограничит клиент в изменении его.