在Resharper 5中为C#分配建议之前的冗余条件检查

时间:2011-01-20 20:25:25

标签: c# properties resharper setter getter

以下示例中的条件检查是否真的多余?:

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中,即使没有进行显式检查,每当调用setter时它都会运行getter is called implicitly by the VM。最终结果是在分配之前进行检查会导致两个检查,一个显式检查和一个隐式检查,从而导致冗余检查。在C#中发生了类似的事情吗?

4 个答案:

答案 0 :(得分:10)

只有两种情况我见过这种检查。

第一种是当有一行额外的代码将对象的另一个属性设置为True以指示该对象已被修改。这通常在尝试决定是否将对象的状态持久化为数据库时使用。

第二种情况是有问题的类型是不可变的。您可能希望避免设置值,从而创建新字符串,例如,当值相同时。即使这样,我也只在内存使用至关重要的某些应用中看到它。

答案 1 :(得分:4)

在这种特定情况下,它在逻辑上是多余的,因为在getter中没有执行代码 - 只是在私有字段周围的直接包装器。如果你习惯把东西放在你的吸气剂中会产生副作用,我会说要禁用那个R#警告。

可能值得尝试将物品放入物业的吸气剂中,看看ReSharper是否仍然认为它是多余的。如果确实如此,那我就称之为R#bug。

答案 2 :(得分:1)

我会说检查是多余的。如果你有INotifyPropertyChanged的实现会更有意义,但是如果没有进行实际的更改,那么检查将在setter中以避免触发事件。

答案 3 :(得分:0)

如果(MyProperty != newValue)是多余的,则该行将产生相同的结果