2016-09-29 25 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語句來以類似於:

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

但是對我來說,這個檢查似乎甚至是沒有意義的,並且可以很容易地忽略,因爲條件是真的。所以我想知道爲什麼ReSharper檢測到針對null的過時檢查,但對其他人不適用。

我是否錯過檢查失敗的情況?

+0

Resharper應該如何知道長度在運行時會有什麼值? – Alex

+0

@ j0ey_wh嗯,公平點。它不知道房產是不可變的,那就是你的意思,不是嗎? – HimBromBeere

+0

也許如果你引入一個長度變量它會注意到嗎? – Euphoric

回答

0

來解釋我的評論:

在我看來,事情是這樣的:每次測試你的價值的時候,您對吸氣的調用。 Resharper不知道你的實際吸氣劑是否會改變你的價值。第一次調用getter時,它可能會返回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 

我同意這個類是非常特殊的,並在已取得目的是使條件起作用,但仍然表明案件是可能的。

總的來說,它表明由於在每個條件之間調用getter,所以該值可以改變,所以調用並不是多餘的。

1

除了Visalievski的回答,讓我補充另一個 - 更簡單 - 例如:

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

在這個片段中,ReSharper的不檢測不到的代碼。

但讓我對該代碼做一個小改動:讓我保持不變。

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

現在,ReSharper的抱怨無法訪問的代碼,而我得到了VS2015編譯器警告CS0162。

因此,在處理特定值時,ReSharper和編譯器都會詢問該值是否保證不變。因此我得出結論,與null一起使用的啓發式和具體的值是不同的。