2016-09-29 3 views
0

Ich habe diesen Code:ReSharper kann nicht unerreichbaren Code finden

Assert.IsTrue(datasetMetadata1 != null && datasetMetadata1.Length == 5); 
Assert.IsTrue(datasetMetadata2 != null && datasetMetadata2 .Length == 11); 

if ((datasetMetadata1 == null || datasetMetadata1.Length != 5) || 
(datasetMetadata2 == null || datasetMetadata2 .Length != 11) 
{ 
    /* do something */ 
} 

die ReSharper vereinfacht durch die redundante Entfernen (weil Allways true) Ausdruck == null und durch die if -Aussage etwas Umkehren ähnlich wie:

if ((datasetMetadataPunktort.Length == 5) && (datasetMetadataFlurstueck.Length == 11)) 
    return 

Aber für mich scheint selbst diese Prüfung bedeutungslos und kann leicht weggelassen werden, da die Bedingung immer wahr ist. Also frage ich mich, warum ReSharper den veralteten Check gegen null erkennt, aber nicht für den Rest.

Fehle ich jeden Fall, in dem die Überprüfung fehlschlägt?

+0

Wie soll Resharper wissen, welche Werte die Länge zur Laufzeit haben wird? – Alex

+0

@ j0ey_wh Hmmm, schöner Punkt.Es kann nicht wissen, ob die Immobilie unveränderlich ist, das ist es was du meinst, oder? – HimBromBeere

+0

Vielleicht, wenn Sie eine Variable der Länge vorstellen wird es bemerken? – Euphoric

Antwort

0

meines Kommentars zu erklären:

Meiner Ansicht nach ist das, was der folgende: Jedes Mal, wenn Sie Ihren Wert testen, Sie machen einen Aufruf an den Getter. Resharper weiß nicht, ob Ihr tatsächlicher Getter Ihren Wert ändert oder nicht. Es könnte möglich sein, dass beim ersten Aufruf des Getters 5 zurückgegeben wird und der Wert um 6 erhöht wird. Beim nächsten Mal werden also 11 zurückgegeben.

Ich habe diese kleine Konsolenanwendung als Beispiel:

Dieser cla die Parameter mit dem speziellen Getter enthält.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var testObject = new TestClass(5); 
     if ((testObject.Length == 5) && (testObject.Length == 11)) 
     { 
      Console.WriteLine("TRUE"); 
     } 
     else 
     { 
      Console.WriteLine("FALSE"); 
     } 
     Console.Read(); 

    } 
} 

Und wir haben die folgende Ausgabe::

TRUE 

Ich stimme dieser Klasse ist etwas ganz Besonderes, und wurde in der gemacht

public class TestClass 
{ 
    private int _length; 

    public int Length 
    { 
     get 
     { 
      var localLength = _length; 
      _length += 6; 
      return localLength; 
     } 
     set { _length = value; } 
    } 

    public TestClass(int length) 
    { 
     this._length = length; 
    } 
} 

Diese Klasse wird für Testzwecke verwendet Zweck, um die Bedingung zu arbeiten, aber immer noch zeigt, dass der Fall möglich ist.

Insgesamt zeigt es, dass, da der Getter zwischen jeder Bedingung aufgerufen wird, der Wert sich ändern kann, so dass der Aufruf nicht redundant ist.

1

Neben Visalievski Antwort, lassen Sie mich eine weitere hinzufügen - noch einfacher - Beispiel:

int i = 5; 
if (i != 5) 
{ 
    // do something 
} 

Mit diesem Code-Schnipsel, ist ReSharper nicht unerreichbaren Code erkennen.

Aber lass mich eine kleine Änderung an diesem Code machen: mache ich konstant. Jetzt

const int i = 5; 
if (i != 5) 
{ 
    // do something 
} 

, klagt ReSharper über nicht erreichbaren Code, und ich Compiler-Warnung CS0162 in VS2015.

Wenn also spezifische Werte behandelt werden, fragen sowohl ReSharper als auch der Compiler, ob der Wert garantiert konstant ist oder nicht. Daraus schließe ich, dass die Heuristiken mit null und mit spezifischen Werten unterschiedlich sind.

Verwandte Themen