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