今天,我调查了我们软件中的逻辑错误,并发现这与 VB.NET 线程变量在循环中的方式有关。假设我有以下代码:
产生以下输出
问题在于声明了
在VB.NET中,声明在for循环内部的变量会保留其值供下一次迭代使用。这是设计上的决定:http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/c9cb4c22-d40b-49ff-b535-19d47e4db38d,但这也是程序员容易掉进的陷阱。
然而,直到现在,我还没有意识到这个问题/行为。我们大部分的代码库都是C#,它不允许使用未初始化的变量,因此没有问题。
但是我们有一些遗留的VB.NET代码需要支持。
我认为我们团队中没有人曾经有过有目的地使用它的经历。如果我想要明确地在for循环中共享一个变量,我会在范围外声明它。
因此,在这种特殊情况下,最好的方法是生成一个警告,甚至是一个错误。但即使是使用Option Explicit / Option Strict也不会产生警告/错误。
有办法使这成为编译时错误,或者用FxCop检查吗?
Dim numbers As New List(Of Integer) From {1, 2, 3, 4, 5}
For Each number As Integer In numbers
Dim isEven As Boolean
If number Mod 2 = 0 Then
isEven = True
End If
If isEven Then
Console.WriteLine(number.ToString() & " is Even")
Else
Console.WriteLine(number.ToString() & " is Odd")
End If
Next
产生以下输出
1 is Odd
2 is Even
3 is Even
4 is Even
5 is Even
问题在于声明了
isEven
但没有赋值。
在这种情况下,正确的写法应该是dim isEven as Boolean = false
,但我没有这样做。在VB.NET中,声明在for循环内部的变量会保留其值供下一次迭代使用。这是设计上的决定:http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/c9cb4c22-d40b-49ff-b535-19d47e4db38d,但这也是程序员容易掉进的陷阱。
然而,直到现在,我还没有意识到这个问题/行为。我们大部分的代码库都是C#,它不允许使用未初始化的变量,因此没有问题。
但是我们有一些遗留的VB.NET代码需要支持。
我认为我们团队中没有人曾经有过有目的地使用它的经历。如果我想要明确地在for循环中共享一个变量,我会在范围外声明它。
因此,在这种特殊情况下,最好的方法是生成一个警告,甚至是一个错误。但即使是使用Option Explicit / Option Strict也不会产生警告/错误。
有办法使这成为编译时错误,或者用FxCop检查吗?