2011-10-07 70 views
2

...所以我有這樣的代碼:Resharper是否不必要地警告我關於訪問修改的關閉?

 foreach (var entry in list) 
     { 
      var marginOneEntry = otherList.FirstOrDefault(p => p.Margin == entry.Margin);     
      if (marginOneEntry == null) continue; 
      // Do stuff with marginOneEntry 
     } 

和ReSharper的5.1警告我,「進入修改封」在lambda表達式中比較語句使用entry。 FirstOrDefault-call是不是取消了這個問題?我的代碼不好,或者這個警告只是Resharper的一個缺點?

注意:我已經閱讀了關於在此處訪問修改的閉包的其他主題,但我想要爲這個特定案例找到答案,並且澄清Resharper是否對此主題過於敏感。

回答

3

是的,這是ReSharper的一個問題,因爲它沒有區分與懶惰評估結果從方法不使用在懶惰計算給定lambda值的方法。 FirstOrDefault不會做懶惰的評估(忘記與'lazy'相對的術語),因此可以安全地在您的示例中使用它,但通常無法從方法的簽名中理解。

+3

與懶惰相反的術語會很渴望。 –

3

我覺得你在代碼中犯了一個錯誤之上。您的.Where(p => entry.Margin == 1)先決條件不涉及被枚舉的元素。你的意思是p.Margin == 1

此外,而不是寫作x.Where(y).FirstOrDefault()你可以簡單地寫x.FirstOrDefault(y)

+0

關於FirstOrDefault:謝謝,我改變了這一點。但我的意思是訪問Where子句中的入口變量。這就是爲什麼Resharper正在做出反應。不過,我已經將代碼片段更改爲現實。假設我們有兩個與實體相同的列表 - 「列表」和「其他列表」。 – Nilzor