VB.NET中如何避免在Lambda表达式中误用迭代变量?
- 内容介绍
- 文章标签
- 相关推荐
本文共计432个文字,预计阅读时间需要2分钟。
在VB.NET中使用LINQ时,有时会遇到类似以下查询的警告:
vbFor i As Integer=0 To 10 Dim num As Integer=(From n In numbers Where n Mod i=0 Select n).First()Next
警告内容为:在lambda表达式中使用迭代变量可能会产生意外结果。
这是因为LINQ查询在执行时可能会重用迭代变量,导致结果不可预测。为了解决这个问题,可以使用`Let`关键字创建局部变量,如下所示:
vbFor i As Integer=0 To 10 Dim num As Integer=(From n In numbers Let temp=n Mod i Where temp=0 Select temp).First()Next
我在VB.NET中使用LINQ,有时我会遇到类似的查询For i = 0 To 10 Dim num = (From n In numbers Where n Mod i = 0 Select n).First() Next
然后它会出现警告“在lambda表达式中使用迭代变量可能会产生意外结果.相反,在循环中创建一个局部变量并为其赋值迭代变量的值.”
我知道在lambda表达式中使用迭代变量不是一个好习惯,因为只在需要时才计算lambda表达式. (This question是关于那个)
现在我的问题是,如何在使用First(),Single(),ToList()等结构对就地计算表达式的情况下抑制此警告(这只是一个警告,但我喜欢我的代码清理.)
(声明一个局部变量并将迭代变量传递给它是一个选项,但我正在寻找一个干净的解决方案.)
在立即计算lambda的特定情况下,您可以通过在for循环外移动迭代变量的声明来安全地消除警告.Dim i = 0 For i = 0 To 10 ...
我确实想强调,这只有在lambda没有转义for循环时才有效(对于你的场景是真的).
这里还有一篇关于我在这个警告上写的文章的详细链接(为什么它存在,如何避免它等等)
> blogs.msdn.com/b/jaredpar/archive/2007/07/26/closures-in-vb-part-5-looping.aspx
本文共计432个文字,预计阅读时间需要2分钟。
在VB.NET中使用LINQ时,有时会遇到类似以下查询的警告:
vbFor i As Integer=0 To 10 Dim num As Integer=(From n In numbers Where n Mod i=0 Select n).First()Next
警告内容为:在lambda表达式中使用迭代变量可能会产生意外结果。
这是因为LINQ查询在执行时可能会重用迭代变量,导致结果不可预测。为了解决这个问题,可以使用`Let`关键字创建局部变量,如下所示:
vbFor i As Integer=0 To 10 Dim num As Integer=(From n In numbers Let temp=n Mod i Where temp=0 Select temp).First()Next
我在VB.NET中使用LINQ,有时我会遇到类似的查询For i = 0 To 10 Dim num = (From n In numbers Where n Mod i = 0 Select n).First() Next
然后它会出现警告“在lambda表达式中使用迭代变量可能会产生意外结果.相反,在循环中创建一个局部变量并为其赋值迭代变量的值.”
我知道在lambda表达式中使用迭代变量不是一个好习惯,因为只在需要时才计算lambda表达式. (This question是关于那个)
现在我的问题是,如何在使用First(),Single(),ToList()等结构对就地计算表达式的情况下抑制此警告(这只是一个警告,但我喜欢我的代码清理.)
(声明一个局部变量并将迭代变量传递给它是一个选项,但我正在寻找一个干净的解决方案.)
在立即计算lambda的特定情况下,您可以通过在for循环外移动迭代变量的声明来安全地消除警告.Dim i = 0 For i = 0 To 10 ...
我确实想强调,这只有在lambda没有转义for循环时才有效(对于你的场景是真的).
这里还有一篇关于我在这个警告上写的文章的详细链接(为什么它存在,如何避免它等等)
> blogs.msdn.com/b/jaredpar/archive/2007/07/26/closures-in-vb-part-5-looping.aspx

