Проверка избыточного состояния перед предложением назначения для C # в Resharper 5 - PullRequest
15 голосов
/ 20 января 2011

Действительно ли проверка состояния избыточна в следующем примере?

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, но является ли check избыточным?

В Adobe Flex геттер неявно вызывается виртуальной машиной , с которой он работает всякий раз, когда вызывается сеттер, даже если явная проверка не выполняется. Конечным результатом является то, что проверка перед назначением приводит к двум проверкам, одна явная и одна неявная, что приводит к избыточной проверке. Что-нибудь подобное происходит в C #?

Ответы [ 4 ]

10 голосов
/ 20 января 2011

Есть только две ситуации, когда я видел этот тип проверки.

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

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

4 голосов
/ 20 января 2011

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

Возможно, стоит попытаться поместить что-то в получатель свойства и посмотреть, считает ли ReSharper, что это избыточно. Если это так, то я бы назвал это ошибкой R #.

1 голос
/ 20 января 2011

Я бы сказал, что проверка избыточна.Было бы более разумно, если бы у вас была реализация INotifyPropertyChanged , но тогда проверка была бы в установщике, чтобы избежать запуска события, если никакие фактические изменения не сделаны.

0 голосов
/ 14 ноября 2016

если (MyProperty != newValue) - избыточно, выход из строки даст тот же результат

...