У меня есть класс, который определяет свойство только для чтения, которое эффективно предоставляет приватное поле, что-то вроде этого:
public class Container
{
private List<int> _myList;
public List<int> MyList
{
get { return _myList;}
}
public Container() : base ()
{
_myList = new List<int>();
}
// some method that need to access _myList
public SomeMethod(int x)
{
_myList.Add(x);
}
}
теперь потребитель не может напрямую управлять моей собственностью, поэтому используйте код aContainer.MyList = new List (); генерирует ошибку во время компиляции.
Однако потребитель может абсолютно свободно вызывать все виды методов по полученной ссылке, так что это совершенно правильный код
Container c = new Container();
Console.WriteLine(c.MyList.Count);
c.MyList.Add(4);
Console.WriteLine(c.MyList.Count);
, который побеждает всю концепцию только для чтения.
Есть ли какой-нибудь разумный обходной путь, который позволил бы мне иметь реальную ссылку только для чтения?
P.S. Я не могу просто вернуть копию списка, потому что тогда пользователь будет думать, что он внес все необходимые изменения, но, увы ... они пропадут.