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