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

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

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

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

public class MyClass
{
      public int _i = 5;

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

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

Спасибо

22
задан lance 20 September 2011 в 18:03
поделиться

5 ответов

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

Чтобы добавить к другим ответам, обратите внимание, что вы можете изменить серьезность этой проверки в ReSharper | Параметры | Проверка кода | Уровень серьезности проверки | Поле можно сделать только для чтения . У меня это как «Показать как предложение»; вы можете попросить ReSharper полностью игнорировать эту проверку, если хотите.

3
ответ дан 29 November 2019 в 04:33
поделиться

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

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

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

4
ответ дан 29 November 2019 в 04:33
поделиться

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

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

5
ответ дан 29 November 2019 в 04:33
поделиться

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

29
ответ дан 29 November 2019 в 04:33
поделиться

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

3
ответ дан 29 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: