变量在for循环中声明.如何使这成为编译时错误?

Jür*_*ock 10 vb.net scope for-loop

今天我调查了我们软件中的一个逻辑错误,并发现这与循环中VB.NET线程变量的方式有关.

假设我有以下代码:

    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
Run Code Online (Sandbox Code Playgroud)

产生以下输出

1 is Odd
2 is Even
3 is Even
4 is Even
5 is Even
Run Code Online (Sandbox Code Playgroud)

问题是isEven声明但未分配.在这种特殊情况下,写入是正确的,dim isEven as Boolean = false但我没有这样做.

在VB.NET中,在for循环中声明的变量保留其下一个itaration的值.这是设计:http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/c9cb4c22-d40b-49ff-b535-19d47e4db38d,但这对程序员来说也是一个危险的陷阱.

但是,直到现在,我还没有意识到这个问题/行为.到现在.我们的代码库大部分都是C#,它不允许使用未初始化的变量,所以没有问题.

但是我们有一些用VB.NET编写的遗留代码,我们必须支持.

我不认为我们的开发团队中的任何人都曾用过这个目的.如果我明确想要在for循环内的迭代中共享变量,我将其声明在范围之外.

因此,最好的办法是在这种特定情况下产生警告甚至错误.但即使使用Option Explicit/Option Strict,也不会产生警告/错误.

有没有办法使这个编译时错误或者可能用FxCop检查这个?

J..*_*... 2

我认为我们的开发团队中没有人有目的地使用过这个。如果我明确想要在 for 循环内的迭代中共享变量,我会在范围之外声明它。

我认为在循环内声明变量的全部目的是显式地将其范围限制在该块内。要使其成为编译时错误,将从语言中删除块级作用域。虽然在某些情况下方法级作用域是合理的,但毫无疑问也存在块级作用域的重要性的情况。我认为如果不引入一些新的语法方法来使用它,你就不能轻易地将其从语言中删除。此时您正在进入重新设计 VB.NET 的领域 - 我不确定是否有一种简单的方法可以做到这一点。

  • 我不想限制在循环内声明变量我不想限制在循环内声明变量而不初始化它。应该允许“dim someValue as Integer = 0”,但不应该“dim someValue as Integer”,因为后者引入了潜在的危险,因为它会记住下一个迭代中是否最后分配的值。 (2认同)