Подтвердить что ты не робот

Есть ли какая-либо польза для создания поля С# только для чтения, если это необходимо?

Я работаю над проектом с использованием ReSharper. Иногда это подсказывает мне, что поле может быть сделано только для чтения. Есть ли какие-либо результаты или другие преимущества для этого? Я предполагаю, что выгоды будут довольно низкоуровневыми или какие-либо преимущества будут чисто семантическими?

Спасибо

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

public class MarketsController : Controller
{
    private readonly IMarketsRepository marketsRepository;

    public AnalysisController(IMarketsRepository marketsRepository)
    {                
        this.marketsRepository = marketsRepository;
    }
}

Edit Каков самый простой способ взглянуть на MSIL?

4b9b3361

Ответ 1

Пособие чисто семантическое. Это поможет пользователям вашего кода явно понять, что это поле не может быть изменено после создания объекта. Компилятор предотвратит нежелательные изменения этого поля. Я полностью согласен со следующей цитатой из Python Zen:

Явный лучше, чем неявный.

Некоторые сведения:

Единственное различие между нормальным полем и полем только для чтения - флаг initonly в IL. Это не оптимизация (как с константами), потому что фактически она позволяет все операции (get и set, но только в ctor). Это просто намек на компилятор: не позволяйте его изменять после построения.

.field public initonly int32 R

Ответ 2

Это не столько низкая производительность, сколько более высокая ремонтопригодность. Создание вещей только для чтения - одна из возможностей, которую вы должны ограничить и контролировать количество мест, значение которых может быть изменено. Это, в свою очередь, означает, что вы уменьшаете взаимозависимость между классами (a.k.a. "свободная связь" ); результатом является приложение, которое имеет меньше внутренних зависимостей и, следовательно, более низкую сложность. Другими словами, поля и свойства readonly делают ваше приложение более удобным.

Ответ 3

Мой профессор научил меня в тот день, когда декларирование чего-то только что прочитанного - это способ признать ваш компьютер ошибками.

Ответ 4

Вам может быть интересно этот ответ.

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

Ответ 5

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