2016-09-29 4 views
0

У меня есть этот код:ReSharper не может найти недостижимый код

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 */ 
} 

которого ReSharper упрощает путем удаления излишнего (потому что true) ВСЕГДА выражение == null и опрокидывание if -statement на нечто похожее на:

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

Однако мне кажется, что даже эта проверка бессмысленна и может быть легко исключена, поскольку условие всегда истинно. Поэтому мне интересно, почему ReSharper обнаруживает устаревшую проверку против null, но не для остальных.

Я пропустил какой-либо случай, когда проверка не удалась?

+0

Как Reharper должен знать, какие значения будет иметь длина во время выполнения? – Alex

+0

@ j0ey_wh Хммм, справедливая точка.Он не может знать, является ли свойство неизменным, это то, что вы имеете в виду, разве это не так? – HimBromBeere

+0

Может быть, если вы представите переменную длины, она заметит? – Euphoric

ответ

0

объяснить свой комментарий:

На мой взгляд, вещь заключается в следующем: Каждый раз, когда вы проверяете значение, вы делаете вызов добытчика. Resharper не знает, изменяет ли ваш фактический геттер или нет ваше значение. Возможно, в первый раз, когда вы вызываете геттер, он возвращает 5 и увеличивает значение на 6. Так что в следующий раз у вас будет 11 возвращенных.

Я создал это небольшое приложение консоли в качестве образца:

Этого CLAS содержит параметр с особым геттером.

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; 
    } 
} 

Этот класс используется для целей тестирования:

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(); 

    } 
} 

И мы имеем следующий вывод:

TRUE 

Я согласен этот класс имеет особое значение, и было сделано в чтобы сделать условие работоспособным, но все же оно показывает, что дело возможно.

В целом, это показывает, что поскольку геттер вызывается между каждым условием, значение может меняться, поэтому вызов не является избыточным.

1

В дополнение к ответу Visalievski, позвольте мне добавить еще один - еще проще - пример:

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

С помощью этого сниппета, ReSharper не обнаруживает недостижимый код.

Но позвольте мне внести небольшое изменение в этот код: make i constant.

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

Теперь ReSharper жалуется недостижимого кода, и я получаю предупреждение компилятора CS0162 в VS2015.

Таким образом, при работе с определенными значениями, как ReSharper, так и компилятор спрашивают, гарантировано ли постоянное значение или нет. Поэтому я пришел к выводу, что эвристика, используемая с null и с определенными значениями, различна.