vb.net - 在 for 循环中声明的变量。我如何使它成为编译时错误?

标签 vb.net for-loop scope

今天我调查了我们软件中的一个逻辑错误,并发现这与循环内 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

产生以下输出
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 来检查这个?

最佳答案

I don't think that anyone of our dev team has ever used this with purpose. If I explicitly want to share a variable over iterations inside a for loop, I declare it outside the scope.



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

关于vb.net - 在 for 循环中声明的变量。我如何使它成为编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9886465/

相关文章:

python - 如何使用公共(public)字符串为多个文本文件运行脚本?

javascript - 传递函数与传递匿名闭包的排序行为

python - 嵌套函数中的局部变量

c# - 确定程序集的 PEFileKind 的好方法吗?

vb.net - VB.NET“如果”运算符会导致装箱吗?

vb.net - VS Ultimate 和 Express 编译器之间的差异

javascript - 到达数组末尾后如何执行函数?

java - 对于(房间 r : ArrayList<Room>) returns empty Room

javascript - 使 php 中的变量具有外部作用域

vb.net - 反编译 vb.net 应用程序