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