У меня есть класс, который определяет свойство только для чтения, которое эффективно предоставляет частное поле, примерно так:
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. Я не могу просто вернуть копию списка, потому что тогда пользователь будет думать, что он внес все необходимые изменения, но, увы ... они исчезнут.