[英]Access to variable in closure
我知道關於SO的問題很多,而且Eric Lippert也發表了一篇很棒的文章。 仍然我不太確定以下代碼中發生了什么以及發出“ Reshaper”警告的原因:
public class Class
{
public string Id { get; set; }
}
public class GenericClass<T>
{
public virtual bool Exists(Predicate<T> match)
{
return true;
}
}
public class Main
{
public void Test()
{
var list = new List<Class>();
var list2 = new GenericClass<Class>();
foreach (var item in list)
{
if (list2.Exists(o => o.Id == item.Id)) // access to variable in closure on item
}
}
}
這可以通過以下方式輕松解決:
var localCopy = item;
if (list2.Exists(o => o.Id == localCopy.Id))
據我了解,如果localCopy正確,在存在的所有閉包中是否引用相同的實例? 但這不應該成為問題,因為對存在進行了立即評估,對嗎? 那我在哪里錯了?
但這不應該成為問題,因為對存在進行了立即評估,對嗎?
是的, GenericClass.Exists
急切地評估lambda,但是ReSharper並不知道這一點。
ReSharper所知道的就是,您正在將閉包傳遞給另一個方法-該方法可能會延遲執行lambda,因此出現警告。
是否有任何方法可以告訴Resharper,對於該方法,不需要警告?
查看文檔, 看來您可以使用InstantHandleAttribute
屬性裝飾謂詞參數。
告訴代碼分析引擎,當調用的方法在堆棧上時,參數是否已完全處理。 如果參數是委托,則表示在執行方法的同時執行委托。 如果參數是可枚舉的,則表示在執行方法時將其枚舉
請參閱此處以了解如何安裝JetBrains代碼注釋屬性: 源代碼中的注釋
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.