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

Почему resharper предлагает использовать readonly в полях, которые не изменяются?

чтобы прояснить вопрос, я хотел бы добавить, что я не спрашиваю, почему я должен выбирать readonly через const или какие преимущества имеют readonly над const.

Я спрашиваю, почему сделать поле только для чтения только потому, что он не изменился (на данный момент).

например: если я напишу следующий класс:

public class MyClass
{
      public int _i = 5;

      // Code that doesn't change the value of i:
      ...
}

Resharper укажет, что он может быть сделан только для чтения.

Спасибо

4b9b3361

Ответ 1

Когда он обнаруживает, что вы не назначаете переменную, кроме как при инициализации, она предполагает, что вы не хотите, чтобы переменная менялась. Создание переменной readonly (или const) не позволит вам назначить эту переменную в будущем. Поскольку это кажется (по использованию) поведением, которое вы хотите, оно предполагает, что вы его формализуете и извлекаете выгоду из защиты.

Ответ 2

Обычно я пытаюсь вспомнить 1 чтобы сделать то, что Resharper пытается напомнить вам сделать. Если у меня есть какие-либо неизменяемые поля, я хотел бы отметить их readonly, чтобы формализовать это. На многих типах я делаю это все поля. Существуют преимущества неизменности ([2] [3]), и Resharper пытается помочь вам воспользоваться ими.

1 Я лично не использую Resharper. У меня есть свои причины.

Ответ 3

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

Ответ 4

Хорошо, довольно очевидно, что переменная, которая никогда не изменялась, должна быть либо константой, либо только для чтения. Вопрос, который один из них лучше, зависит от ситуации. Константные переменные по определению постоянны - их значения НИКОГДА не изменяются (например, const int minutesInAnHour = 60; выглядит хорошим кандидатом). Поэтому константа является неявным статическим членом и инициализируется во время компиляции, т.е. Компилятор может фактически заменить все значения вашей константы литеральным значением, хотя я не уверен, что какой-либо компилятор действительно это делает.

С другой стороны, readonly является переменной-членом, значение которой не должно меняться после инициализации, что означает, что она фактически не является константой, вы можете что-то сделать в строках readonly DateTime time = DateTime.Now;. Это, конечно, не будет статическим членом, на самом деле он будет нормальным членом только с ограничением, что он не может быть изменен после назначения. Преимущество этого vs. const заключается в том, что если ваша константная переменная изменяется в некоторой сборке, другие библиотеки зависимых могут не знать об этом - они могут даже иметь постоянное значение, скомпилированное в - вам придется перестроить все.

И что касается вопроса о том, почему resharper предлагает readonly vs. const - я не уверен, я бы предположил, что переменная readonly менее ограничительна, и она показывает, что то, что разработчик, вероятно, хотел.

Ответ 5

Resharper укажет, что он может быть сделан только для чтения.

Чтобы добавить к другим ответам, обратите внимание, что вы можете изменить серьезность этой проверки в ReSharper | Options | Code Inspection | Inspection Severity | Field can be made readonly. У меня это как "Показать как предложение"; вы можете попросить ReSharper полностью игнорировать эту проверку, если хотите.