在使用未分配的局部变量时,如何在VB.NET中强制编译时警告?

Mar*_*tyn 4 vb.net

今天我发现我多年来对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()
Run Code Online (Sandbox Code Playgroud)

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

在C#中,等效代码将无法编译,因为您将获得错误"使用未分配的局部变量'var1'"的编译时错误.

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

我发现这种行为对我来说是非常直观的,我想在VB.NET中至少有一个编译时警告/当我这样做.(我也可以在我已经拥有的任何项目上设置这个并得到警告,这将允许我检查我的假设不会导致错误).

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

Han*_*ant 5

我们必须努力修复你的直觉,因为从编译器中获取错误不是一种选择.部分实现,您可以收到此警告:

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

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

好的,直觉.如果运行时将实现所需的行为,则必须为循环的每次迭代分配一个变量.这意味着局部变量的数量仅受迭代次数的限制.这非常浪费,并且是StackOverflowException的一个非常简单的触发器.JIT编译器没有这样做,它重用了变量.这也发生在C#中,减去了当然没有明确初始化值的选项.

Fwiw:我非常同意你的观点,这是无益的行为.您可能会在connect.microsoft.com找到接受的耳朵,在那里发布您的功能请求,V​​B.NET团队将会看到它.客户以及MSFT内部都有强烈的支持,使VB.NET和C#功能相当.如果您发布了反馈报告的链接,那么我很乐意将其投票.