【发布时间】:2011-04-29 07:17:45
【问题描述】:
在这里看到几个类似的问题,但似乎都不是我的问题......
我了解(或认为我了解)闭包的概念,并且了解导致 Resharper 抱怨访问修改后的闭包的原因,但在下面的代码中,我不明白我是如何违反闭包的。
因为primaryApps 是在for 循环的上下文中声明的,所以primary 在我处理primaryApps 时不会改变。如果我在 for 循环之外声明了primaryApps,那么我绝对有关闭问题。但是为什么在下面的代码中呢?
var primaries = (from row in openRequestsDataSet.AppPrimaries
select row.User).Distinct();
foreach (string primary in primaries) {
// Complains because 'primary' is accessing a modified closure
var primaryApps = openRequestsDataSet.AppPrimaries.Select(x => x.User == primary);
Resharper 是不是不够聪明,无法确定这不是问题,还是我没有看到这里关闭是一个问题的原因?
【问题讨论】:
-
您确定要使用“选择”而不是“位置”吗?
-
Select 返回一个类型化数据行的数组...其中返回一个 IEnumerable。任何一个都适合我正在做的事情;我读过文章说 .Select 在我使用的条件下更快。也许是,也许不是,很难说。
-
我收回了...因为我有一个 lambda,我没有使用内置的 datatable.select(),所以我没有得到一个类型化行的数组。在这种情况下,你是对的,我没有转换值,所以 where 更有意义。
-
警告是关于一个已经导致很多人陷入很多问题的陷阱 - 只需查看关于闭包和 foreach 循环的 SO 问题的数量。因此,我认为这是一个很好的警告。
-
我认为这是一个很好的警告,我不会忽视。只需要了解为什么我会在这种情况下得到它,我现在就这样做:)
标签: c# linq resharper closures