以下示例中的条件检查是否真的多余?:
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#中发生了类似的事情吗?
答案 0 :(得分:10)
只有两种情况我见过这种检查。
第一种是当有一行额外的代码将对象的另一个属性设置为True以指示该对象已被修改。这通常在尝试决定是否将对象的状态持久化为数据库时使用。
第二种情况是有问题的类型是不可变的。您可能希望避免设置值,从而创建新字符串,例如,当值相同时。即使这样,我也只在内存使用至关重要的某些应用中看到它。
答案 1 :(得分:4)
在这种特定情况下,它在逻辑上是多余的,因为在getter中没有执行代码 - 只是在私有字段周围的直接包装器。如果你习惯把东西放在你的吸气剂中会产生副作用,我会说要禁用那个R#警告。
可能值得尝试将物品放入物业的吸气剂中,看看ReSharper是否仍然认为它是多余的。如果确实如此,那我就称之为R#bug。
答案 2 :(得分:1)
我会说检查是多余的。如果你有INotifyPropertyChanged的实现会更有意义,但是如果没有进行实际的更改,那么检查将在setter中以避免触发事件。
答案 3 :(得分:0)
如果(MyProperty != newValue
)是多余的,则该行将产生相同的结果