2013-09-01 5 views
2

Я иду из 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()» каждый отдельный элемент на основе ссылок (так, в основном, все), предоставляя публичный доступ (читать) к этому члену?

То, что я хочу достичь, - это правильная инкапсуляция. Когда пользователь создает экземпляр моего класса и читает член, я хочу, чтобы этот элемент был защищен от записи, если у него также нет публичного сеттера.

+1

'readonly' не влияет на экземпляр, на который указывает поле. На C# нет неизменяемости языкового уровня (пока). – SLaks

+0

См. Также мой блог, http://blog.slaks.net/2013-06-11/readonly-vs-immutable/ – SLaks

+0

Как сделать 'myFlags' конфиденциальным и написать свои собственные методы get/set, где вы можете проверить согласованность ? – Corak

ответ

0

C# предлагает ReadOnlyCollection как опцию для неизменной коллекции.

Надеюсь, это поможет!

Смежные вопросы