Есть ли какая-либо польза для создания поля С# только для чтения, если это необходимо?
Я работаю над проектом с использованием ReSharper. Иногда это подсказывает мне, что поле может быть сделано только для чтения. Есть ли какие-либо результаты или другие преимущества для этого? Я предполагаю, что выгоды будут довольно низкоуровневыми или какие-либо преимущества будут чисто семантическими?
Спасибо
В приведенном ниже примере поле было изначально просто закрытым, но resharper предложила установить его как только для чтения. Я понимаю причину, по которой он может быть установлен как readonly, т.е. его устанавливают в конструкторе и не меняют снова, а просто интересуют, есть ли какие-либо преимущества для этого...
public class MarketsController : Controller
{
private readonly IMarketsRepository marketsRepository;
public AnalysisController(IMarketsRepository marketsRepository)
{
this.marketsRepository = marketsRepository;
}
}
Edit
Каков самый простой способ взглянуть на MSIL?
Ответы
Ответ 1
Пособие чисто семантическое. Это поможет пользователям вашего кода явно понять, что это поле не может быть изменено после создания объекта. Компилятор предотвратит нежелательные изменения этого поля. Я полностью согласен со следующей цитатой из Python Zen:
Явный лучше, чем неявный.
Некоторые сведения:
Единственное различие между нормальным полем и полем только для чтения - флаг initonly
в IL. Это не оптимизация (как с константами), потому что фактически она позволяет все операции (get и set, но только в ctor). Это просто намек на компилятор: не позволяйте его изменять после построения.
.field public initonly int32 R
Ответ 2
Это не столько низкая производительность, сколько более высокая ремонтопригодность. Создание вещей только для чтения - одна из возможностей, которую вы должны ограничить и контролировать количество мест, значение которых может быть изменено. Это, в свою очередь, означает, что вы уменьшаете взаимозависимость между классами (a.k.a. "свободная связь" ); результатом является приложение, которое имеет меньше внутренних зависимостей и, следовательно, более низкую сложность. Другими словами, поля и свойства readonly делают ваше приложение более удобным.
Ответ 3
Мой профессор научил меня в тот день, когда декларирование чего-то только что прочитанного - это способ признать ваш компьютер ошибками.
Ответ 4
Вам может быть интересно этот ответ.
Ключевое слово readonly используется для объявить переменную-член константой, но позволяет вычислять значение во время выполнения. Это отличается от константа, объявленная с константой модификатор, который должен иметь значение установленный во время компиляции. Использование readonly вы можете установить значение поля либо в декларации, либо в конструктор объекта, который поле является членом.
Ответ 5
Это также может помочь обнаружить некоторые ошибки. Значение присваивается только в конструкторе, и это может быть проблемой, если вы забыли изменить что-либо еще или нет. И если он не должен быть изменен, вы помечаете его как только для чтения.