Проверка избыточного состояния перед назначением предложения для С# в Resharper 5
Является ли проверка состояния действительно избыточной в следующем примере?:
public class MyClass {
public bool MyProperty { get; set; }
public void DoSomething(bool newValue) {
// R# says: redundant condition check before assignment
// on the following line:
if (MyProperty != newValue) { // <======
MyProperty = newValue;
}
}
}
Я знаю, что в любом случае MyProperty
будет установлено значение newValue
, но является ли проверено избыточным?
В Adobe Flex геттер неявно называется VM его запуском при каждом вызове сеттера, даже если не выполняется явная проверка, Конечным результатом является то, что проверка перед назначением приводит к двум проверкам, одному явному и одному неявному, что приводит к избыточной проверке. Что-то подобное происходит в С#?
Ответы
Ответ 1
Есть только две ситуации, когда я видел этот тип проверки.
Во-первых, когда есть дополнительная строка кода, которая устанавливает другое свойство объекта в значение True, чтобы указать, что объект был изменен. Обычно это используется при попытке решить, следует ли сохранять состояние объекта чем-то вроде базы данных.
Вторая ситуация заключается в том, что рассматриваемые типы неизменяемы. Возможно, вам захочется избежать установки значения и, следовательно, создания новой строки, например, когда значения будут одинаковыми. Даже тогда я видел это только в некоторых приложениях, где использование памяти имеет решающее значение.
Ответ 2
В этом конкретном случае он логически избыточен, так как в геттере не выполняется код - просто прямая обертка вокруг частного поля. Если у вас есть привычка вкладывать вещи в ваш геттер, который будет иметь побочные эффекты, я бы сказал, чтобы отключить это предупреждение R #.
Возможно, стоит попытаться поместить что-то в getter свойства и посмотреть, не считает ли ReSharper избыточным. Если это произойдет, я бы назвал это ошибкой R #.
Ответ 3
Я бы сказал, что проверка лишняя. Было бы разумнее, если бы у вас была реализация INotifyPropertyChanged, но тогда проверка будет в настройщике, чтобы избежать запуска события, если нет фактическое изменение сделано.
Ответ 4
if (MyProperty != newValue
) IS избыточно, оставив строку, даст тот же результат