2011-01-20 74 views
15

是條件請查看以下示例?:冗餘條件檢查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中,getter is called implicitly by the VM即使沒有進行明確的檢查,也會在調用setter時調用getter is called implicitly by the VM。最終結果是,在分配結果進行兩次檢查之前進行檢查,一次顯式檢查和一次隱式檢查,從而導致冗餘檢查。在C#中有類似的事情嗎?

回答

10

只有兩種情況我看過這種檢查。

第一種情況是當有另外一行代碼將對象上的另一個屬性設置爲True時,表明該對象已被修改。當試圖決定是否將對象的狀態持久化到類似數據庫的情況時,通常會使用它。

第二種情況是所討論的類型是不可變的。您可能希望避免設置該值並因此創建新的字符串,例如,當值相同時。即使那樣,我只在某些應用程序中看到它的內存使用情況非常重要。

+1

對我來說,這是圍繞Windows窗體`TopMost`屬性,它確實有副作用。有關不可變價值的很好的觀點。 – 2011-01-21 16:02:00

1

我想說檢查是多餘的。如果你執行了INotifyPropertyChanged,那麼這將更有意義,但是如果沒有實際更改,檢查將在setter中以避免觸發事件。

4

在這種特殊情況下,它在邏輯上是多餘的,因爲在getter中沒有執行代碼 - 只是圍繞私有字段的直接包裝。如果你習慣於將東西放在吸氣劑中,會產生副作用,我會說要禁用R#警告。

可能值得嘗試把東西放在屬性的吸氣劑中,看看ReSharper是否仍然認爲它是多餘的。如果是這樣,那麼我會稱之爲R#bug。

+1

我將屬性更改爲一個`int`並增加了getter中的值,我仍然看到相同的建議,所以我將考慮它是一個Resharper錯誤。 – 2011-01-21 16:04:28

0

如果(MyProperty != newValue)是多餘的,留行會產生同樣的結果