2011-11-30 57 views
2

我有以下代碼:ToList()是否需要解決「訪問修改的關閉」resharper警告?

foreach (var parent in parents) 
{ 
    var children = data.Find<Order>(x=>x.ParentOrderId==parent.OrderId).ToList(); 
    // Do stuff with the children variable 
} 

ReSharper的告訴我,我有父變量修改關閉問題的訪問。但不調用ToList()意味着它將被立即評估?

這是否否定了這樣做的必要性?

foreach (var parent in parents) 
{ 
    var parentClosure = parent; 
    var children = data.Find<Order>(x=>x.ParentOrderId==parentClosure.OrderId).ToList(); 
    // Do stuff with the children variable 
} 

回答

8

這正是爲什麼「訪問修改的閉包」只是一個警告,而不是一個錯誤。基本上,只要閉包(對它的任何引用)都不能逃脫循環體的一次迭代,你就沒事。

而且,正如你所提到的,.ToList()評估IEnumerable持有閉包,你很好,這個警告確實是無害的,你可以安全地用註釋來壓制它。

爲了讓ReSharper的,知道什麼時候該警告是認真的,它不僅會不得不在封蓋執行逃逸分析,它也必須知道如何既Find<T>.ToList()的行爲相對於保持閉合的保持。這很可能不會很快發生。

3

這只是一個問題,如果你調用一個循環迭代後的parent變量後的lambda表達式改變—。

如果您致電ToList(),lambda只在ToList()調用中使用。

如果您不撥打ToList(),則每次枚舉LINQ查詢時都會使用lambda。
如果您以後從不使用該查詢,那麼yuo不需要ToList()

4

ReSharper無法判斷Find是否將lambda保存在全局的某處以備後用,因此無論如何它都會給出警告。