Есть ли какая-то польза от создания поля C # только для чтения, если это уместно? - PullRequest
23 голосов
/ 03 августа 2010

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

Спасибо

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

public class MarketsController : Controller
{
    private readonly IMarketsRepository marketsRepository;

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

Редактировать Какой самый простой способ взглянуть на MSIL

Ответы [ 5 ]

25 голосов
/ 03 августа 2010

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

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

Некоторые детали:

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

.field public initonly int32 R
9 голосов
/ 03 августа 2010

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

3 голосов
/ 20 августа 2010

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

2 голосов
/ 03 августа 2010

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

1 голос
/ 03 августа 2010

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

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

...