Я иду из C++, и я очень скучаю по «const» в C#.C# изменение поля только для чтения по ссылке
Я разыскал неприятную ошибку в моем коде, подумайте:
class MyClass {
BitArray myFlags { get; private set; } // this should not be able to be manipulated from outside
// ... constructor here creating the BitArray ...
}
// ...
MyClass foo = new MyClass();
BitArray bar = foo.myFlags;
bar.SetAll(false); // circumvents encapsulation eventually putting the class in inconsitent state
Пользователь может без каких-либо проблем, даже непреднамеренно изменить состояние моего объекта. Как безопасно выставлять членов класса, не предоставляя пользователю возможность управлять состоянием моего объекта? Должен ли я использовать «.clone()» каждый отдельный элемент на основе ссылок (так, в основном, все), предоставляя публичный доступ (читать) к этому члену?
То, что я хочу достичь, - это правильная инкапсуляция. Когда пользователь создает экземпляр моего класса и читает член, я хочу, чтобы этот элемент был защищен от записи, если у него также нет публичного сеттера.
'readonly' не влияет на экземпляр, на который указывает поле. На C# нет неизменяемости языкового уровня (пока). – SLaks
См. Также мой блог, http://blog.slaks.net/2013-06-11/readonly-vs-immutable/ – SLaks
Как сделать 'myFlags' конфиденциальным и написать свои собственные методы get/set, где вы можете проверить согласованность ? – Corak