2011-01-20 6 views
15

Czy sprawdzić stan naprawdę zbędny w poniższym przykładzie ?:Redundant sprawdzić stan przed przypisania sugestią dla C# w 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; 
     } 
    } 
} 

wiem, że tak czy inaczej MyProperty zostanie ustawiona na newValue, ale jest sprawdzenie zbędny?

W programie Adobe Flex: getter is called implicitly by the VM jest uruchamiany za każdym razem, gdy wywoływany jest wywoływacz, mimo że nie jest wykonywane jednoznaczne sprawdzanie. Końcowym rezultatem jest to, że sprawdzenie przed przypisaniem daje dwie kontrole, jedną wyraźną i jedną domniemaną, co skutkuje kontrolą redundantną. Czy coś podobnego zdarza się w C#?

Odpowiedz

10

Są tylko dwie sytuacje, w których widziałem tego typu kontrolę.

Pierwszy to dodatkowy wiersz kodu, który ustawia inną właściwość obiektu na wartość True, aby wskazać, że obiekt został zmodyfikowany. Jest to zwykle używane przy podejmowaniu decyzji o utrzymywaniu stanu obiektu na bazie danych.

Druga sytuacja ma miejsce, gdy typy, o których mowa, są niezmienne. Możesz uniknąć ustawienia wartości, a zatem utworzenia nowego ciągu, na przykład, gdy wartości są takie same. Nawet wtedy widziałem to tylko w niektórych aplikacjach, w których użycie pamięci jest krytyczne.

+1

W moim przypadku jest to wokół Windows Forms 'własności TopMost' który robi mieć skutki uboczne. Bardzo dobre uwagi na temat niezmiennych wartości. –

1

Powiedziałbym, że czek jest zbędny. Byłoby bardziej sensowne, gdybyś miał implementację INotifyPropertyChanged, ale wtedy kontrola byłaby w ustawiaczu, aby uniknąć wyzwalania zdarzenia, jeśli żadna rzeczywista zmiana nie zostanie wykonana.

4

W tym konkretnym przypadku jest to logicznie zbędne, ponieważ w programie pobierającym nie ma kodu wykonywalnego - tylko proste opakowanie wokół prywatnego pola. Jeśli masz zwyczaj umieszczania rzeczy w swoim geterze, który miałby efekty uboczne, powiedziałbym, żeby wyłączyć ostrzeżenie R #.

Może warto spróbować umieścić coś w getcie nieruchomości i sprawdzić, czy ReSharper nadal uważa, że ​​jest zbędny. Jeśli tak, to nazwałbym to błędem R #.

+1

Zmieniłem właściwość na 'int' i zwiększałem wartość w pobierającym i nadal widzę tę samą sugestię, więc zamierzam uznać ją za błąd Resharpera. –

+0

Dobrze wiedzieć, dzięki - będę mieć oczy otwarte na ten scenariusz w moich rzeczach. –

0

if (MyProperty != newValue) jest zbędny, pozostawiając linię dadzą ten sam wynik