Проверка избыточного состояния перед назначением предложения для С# в 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 избыточно, оставив строку, даст тот же результат