簡體   English   中英

在閉包中訪問變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM