Csharp/C#教程:访问Lambda表达式中的Modified Closure分享


访问Lambda表达式中的Modified Closure

foreach(var category in categories) { a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category))); } 

代码运行正常,但我在lambda表达式中使用的category得到关于“访问修改后的闭包”的警告。

问题:在这种情况下是否有任何后果的警告?

这里的警告是因为您正在访问Where lambda的闭包内的变量category 。 值category随着每次迭代而变化,并且Where执行延迟,因此它将看到category的当前值与创建lambda时的值。

在这种情况下你很可能。 即使Where进行延迟评估, AddRange方法也是提示的,并将强制评估Where完成。 因此Where方法将看到它期望的category的值。

如果您想删除警告,只需声明迭代变量的本地副本并将其捕获。

 foreach(var category in categories) { var localCategory = category; a.AddRange(_db.Articles.Where(c => c.Categories.Contains(localCategory))); } 

它告诉您“类别”变量存在于闭包中,可以在LINQ表达式之外进行修改。

在这里查看问题以获得一些解释。

上述就是C#学习教程:访问Lambda表达式中的Modified Closure分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/952111.html

(0)
上一篇 2021年11月19日
下一篇 2021年11月19日

精彩推荐