【问题标题】:How can I force a compile-time warning in VB.NET when using an unassigned local variable?使用未分配的局部变量时,如何在 VB.NET 中强制发出编译时警告?
【发布时间】:2010-11-15 12:54:48
【问题描述】:

今天我发现我多年来对 VB.NET 的假设并不正确(令人担忧!)。我假设在循环中声明的变量具有声明它的迭代的生命周期,但实际上它似乎具有整个过程的生命周期。

例如:

        For i As Integer = 0 To 1
            Dim var1 As Boolean
            Console.WriteLine(var1.ToString())
            var1 = True
            Console.WriteLine(var1.ToString())
        Next
        Console.ReadKey()

我假设输出为 False、True、False、True,但实际上它是 False、True、True、True。

在 C# 中,等效代码无法编译,因为您会收到错误“使用未分配的局部变量 'var1'”的编译时错误。

我意识到有很多方法可以解决这个问题,最佳做法是在循环之外声明变量并在每次循环开始时重置它。

我发现这种行为对我来说是如此违反直觉,以至于我希望在/如果我这样做时至少在 VB.NET 中发出编译时警告。 (我也可以在我已经拥有的任何项目上设置它,并收到警告,让我检查我的假设没有导致错误)。

有谁知道如何/如果我可以在 VB.NET 中生成编译时警告?我是唯一一个发现这种反直觉的人吗?

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    我们必须努力修正您的直觉,因为无法从编译器中获取错误。它已部分实现,您会收到此警告:

    错误 BC42104:变量“mumble”在被赋值之前被使用。运行时可能会导致空引用异常。

    并使用 Project + Properties,Compile 选项卡将其从警告提升为错误。但是,正如警告消息所示,这仅支持引用类型引用,它不会为值类型的变量让步。

    好的,直觉。如果运行时会实现您想要的行为,那么它必须为循环的每次迭代分配一个 new 变量。这意味着局部变量的数量仅受迭代次数的限制。这非常浪费,而且很容易触发 StackOverflowException。 JIT 编译器不这样做,它重用变量。这也发生在 C# 中,当然减去不让您显式初始化值的选项。

    Fwiw:我非常同意你的看法,这是无益的行为。您可能会在 connect.microsoft.com 上找到乐于接受的耳朵,在那里发布您的功能请求,V​​B.NET 团队会看到它。客户和 MSFT 都大力支持使 VB.NET 和 C# 功能具有可比性。如果您发布反馈报告的链接,那么我很乐意投票。

    【讨论】:

    • 感谢您的回答,您说得对,我需要修正我的直觉。由于这个假设,我只是担心多年来我在代码中引入的任何错误!我按照你的建议发布了这个连接connect.microsoft.com/VisualStudio/feedback/details/621965/…
    • 在 VB.Net 中,变量会自动初始化为其默认值。在给局部变量赋值之前访问它们是合法的。这不能在不导致许多现有代码的向后兼容性问题的情况下进行更改。当然,这从来没有阻止过他们......
    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 2016-04-15
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多