В Руководстве по проектированию для разработки библиотек классов , Microsoft говорит:
Не назначать экземпляры изменяемых типов для полей только для чтения.
Объекты, созданные с использованием изменяемого типа, могут быть изменены после их создания. Например, массивы и большинство коллекций являются изменяемыми типами, в то время как Int32, Uri и String являются неизменяемыми типами. Для полей, которые содержат изменяемый ссылочный тип, модификатор только для чтения предотвращает перезапись значения поля, но не защищает изменяемый тип от модификации.
Это просто повторяет поведение readonly, не объясняя, почему плохо использовать readonly. Предполагается, что многие люди не понимают, что делает «только для чтения», и ошибочно ожидают, что поля только для чтения будут глубоко неизменными. По сути, он рекомендует использовать «только для чтения» в качестве документации кода, указывающей на глубокую неизменность - несмотря на тот факт, что компилятор не имеет возможности принудительно применить это - и запрещает его использование для своей обычной функции: чтобы гарантировать, что значение поля не изменится после объект был построен.
Мне неловко от этой рекомендации использовать «только для чтения» для обозначения чего-то другого, кроме его обычного значения, понятного компилятору. Я чувствую, что это побуждает людей неправильно понимать значение слова «только для чтения», и, кроме того, ожидать, что оно будет означать то, что автор кода может не намереваться. Я чувствую, что это исключает использование его в местах, где это может быть полезно - например, показать, что некоторые отношения между двумя изменяемыми объектами остаются неизменными в течение всего времени жизни одного из этих объектов. Представление о том, что читатели не понимают значения «только для чтения», также, по-видимому, противоречит другим советам Microsoft, таким как правило «Не инициализировать без необходимости» FxCop, , которое предполагает, что читатели вашего кода быть знатоками языка и знать, что (например) поля bool автоматически инициализируются как false, и мешает вам предоставить избыточность, которая показывает «да, это было сознательно установлено в false; я не просто забыл инициализировать это».
Итак, в первую очередь, почему Microsoft не рекомендует использовать readonly для ссылок на изменяемые типы? Мне также было бы интересно узнать:
- Соблюдаете ли вы это Руководство по проектированию во всем своем коде?
- Чего вы ожидаете, когда видите "только для чтения" в куске кода, который вы не написали?