Что преимущества к маркировке поля как 'только для чтения' в C#?

Другой подход, поскольку в любом случае вы не используете жесткий OXM-подход. Возможно, вы захотите попробовать использовать менее жесткий парсер, такой как JSoup? Это остановит немедленные проблемы с недопустимыми схемами XML и т. Д., Но он просто передаст проблему в ваш код.

271
задан Eddie 26 May 2009 в 14:06
поделиться

6 ответов

readonly ключевое слово используется для объявления членской переменной константа, но позволяет значению быть вычисленным во времени выполнения. Это отличается от константы, объявленной с const модификатор, который должен иметь его набор значений во время компиляции. Используя readonly можно установить значение поля или в объявлении, или в конструкторе объекта, которого поле является членом.

Также использование это, если Вы не хотите должными быть перекомпилировать внешние DLLs, которые ссылаются на константу (так как это заменяется во время компиляции).

156
ответ дан Yuri Ghensev 23 November 2019 в 02:16
поделиться

Я не полагаю, что существует любое увеличение производительности от использования поля только для чтения. Это - просто проверка, чтобы гарантировать, что, как только объект полностью создается, что на поле нельзя указать на новое значение.

Однако "только для чтения" очень отличается от других типов семантики только для чтения, потому что она осуществляется во времени выполнения CLR. Ключевое слово только для чтения компилирует вниз в .initonly, который поддается проверке CLR.

реальное преимущество этого ключевого слова должно генерировать неизменные структуры данных. Неизменные структуры данных по определению не могут быть изменены когда-то созданные. Это делает очень легким рассуждать о поведении структуры во времени выполнения. Например, нет никакой опасности передать неизменную структуру другой случайной части кода. Они не могут, изменил его очень, можно программировать надежно против той структуры.

Вот хорошая запись об одном из преимуществ неизменности: Поточная обработка

185
ответ дан JYelton 23 November 2019 в 02:16
поделиться

Нет никаких очевидных выигрышей в производительности к использованию readonly, по крайней мере, ни один, что я когда-либо видел упомянутый где угодно. Это только для того, чтобы сделать точно, как Вы предполагаете для предотвращения модификации, как только это было инициализировано.

, Таким образом, это выгодно в этом, это помогает Вам записать больше устойчивое, больше читаемого кода. Реальная выгода вещей как это прибывает, когда Вы работаете в команде или для обслуживания. Объявление чего-то как readonly сродни помещению контракта для использования той переменной в коде. Думайте о нем как о добавляющей документации таким же образом как другие ключевые слова как internal или private, Вы говорите, что "эта переменная не должна быть изменена после инициализации", и кроме того Вы осуществление это.

Поэтому, если Вы создаете класс и отмечаете некоторые членские переменные readonly дизайном, тогда Вы предотвращаете себя или другого члена команды, делающего ошибку позже, когда они подробно останавливаются или изменяют Ваш класс. По-моему, это - преимущество, которое стоит иметь (за маленький счет дополнительной сложности языка как doofledorfer упоминания в комментариях).

61
ответ дан Xiaofu 23 November 2019 в 02:16
поделиться

Помещать его в очень практический смысл:

, Если Вы используете константу в dll A и dll B ссылки, что константа, значение той константы будет скомпилировано в dll B. При повторном развертывании dll с новым значением для той константы dll B будет все еще использовать исходное значение.

, Если Вы используете только для чтения в dll A и dll B ссылки, что только для чтения, который только для чтения будет всегда искаться во времени выполнения. Это означает, повторно развертываете ли Вы dll с новым значением для этого только для чтения, dll B будет использовать то новое значение.

46
ответ дан Daniel Auger 23 November 2019 в 02:16
поделиться

Следует иметь в виду, что только для чтения только относится к самому значению, поэтому если Вы используете ссылочный тип, только для чтения, только защищает ссылку от того, чтобы быть изменением. Состояние экземпляра не защищено только для чтения.

9
ответ дан Brian Rasmussen 23 November 2019 в 02:16
поделиться

Будьте осторожны с частными только для чтения массивами. Если они выставляются клиентом в качестве объекта (вы можете сделать это для COM-взаимодействия, как это сделал я), то клиент может манипулировать значениями массивов. Используйте метод Clone() при возврате массива как объекта.

1
ответ дан 23 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: