繁体   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