Можно ли добиться неизменности в C #? Конечно, если вы рассчитываете на это. Вы можете делать творческие вещи с интерфейсами и т. Д., Чтобы раскрыть только get
свойств и ни один из изменяемых методов.
Тем не менее, имейте в виду, что нет ничего, что мешало бы хитрому пользователю преобразовать его обратно к фактическому типу (конечно, то же самое можно сказать и о C ++, вы можете отбросить константу).
ISomeReadOnlyInterface readOnly = new SomeFullObject();
// hah, take that read-only interface!
((SomeFullObject)readOnly).SomeMutatingMethod();
То же и с коллекциями. Даже если вы вернете ReadOnlyCollection (который предотвращает изменение поведения в самой коллекции), данные в коллекции все равно изменчивы (если, конечно, тип позволяет).
Так что, боюсь, здесь нет однозначного ответа. Не существует константы «щелчок-переключатель», которая дает вам то, что делает C ++.
Это действительно ваше дело, вы можете:
- Создавайте неизменяемые типы и возвращайте итераторы (или другие последовательности только для чтения) вместо изменяемых коллекций.
- Возвращайте новые копии каждый раз, чтобы не было ничего страшного, если они их переделают.
- Просто верните фактические данные и оставьте поведение взлома как «undefined».
- и т.д...
Последнее - то, что делают коллекции вроде Dictionary<TKey, TValue>
. Нет ничего, что говорило бы, что вы не можете сделать тип ключа изменяемым типом (но горе, если вы это сделаете), и MSDN довольно ясно показывает, что если вы измените ключ таким образом, что изменится его хэш-код, он будет на вашей собственной шее. ...
Что касается моей собственной работы, я стараюсь не усложнять, если на самом деле нет серьезных опасений, что мой класс может быть изменен таким образом, чтобы вызвать побочные эффекты. Например, если я сохраняю результаты веб-службы в кеше, я вместо этого верну копию кэшированного элемента, чтобы, если пользователь изменяет результат, он случайно не изменил кешированное значение.
Короче говоря, я бы не стал беспокоиться о константной корректности каждого типа, который вы возвращаете, это слишком много. Я бы беспокоился только о вещах, которые вы вернете, которые в случае изменения могут создать побочный эффект для других пользователей.
person
James Michael Hare
schedule
24.07.2012
Immutability in C#
), где разрабатываются неизменяемые типы коллекций. - person Oded   schedule 25.07.2012ReadOnlyCollection
и тому подобное, но они несколько тусклые в том, что у них все еще есть методы мутации, они просто выбрасываются при вызове. Но да, мне тоже нужна ссылка на C ++ - ishconst
... - person James Michael Hare   schedule 25.07.2012const
могло бы спасти меня от ошибки. Преимуществаconst
в C ++ сильно переоценены. Вместо того, чтобы наклоняться назад, пытаясь программировать на C ++ с использованием C #, попробуйте модель C # для программирования. Сомневаюсь, что через несколько лет вы захотите вернуться. - person riwalk   schedule 25.07.2012const
? Нет, но это определенно дает вам некоторое спокойствие и позволяет программировать способами, которые в противном случае были бы подвержены ошибкам. Вы можете свободно возвращать и передавать ссылки, а не копии, зная, что они безопасны. Я полагаю, что точный аргумент, использованный противconst
, может быть использован противprivate
. Тебе действительно не нужноprivate
(богохульство, я знаю). Но без него у вас нет гарантии инкапсуляции во время компиляции.const
обеспечивает аналогичную инкапсуляцию, гарантируя, что ваши драгоценные ценности не будут изменены кем-то другим. - person Eric   schedule 25.07.2012