今天我发现我多年来对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中生成编译时警告?我是唯一发现这种反直觉的人吗?
我们必须努力修复你的直觉,因为从编译器中获取错误不是一种选择.部分实现,您可以收到此警告:
错误BC42104:变量'mumble'在被赋值之前使用.在运行时可能会导致空引用异常.
使用Project + Properties,Compile选项卡将其从警告提升为错误.但是,正如警告消息所示,仅支持引用类型引用,它不会为值类型的变量预算.
好的,直觉.如果运行时将实现所需的行为,则必须为循环的每次迭代分配一个新变量.这意味着局部变量的数量仅受迭代次数的限制.这非常浪费,并且是StackOverflowException的一个非常简单的触发器.JIT编译器没有这样做,它重用了变量.这也发生在C#中,减去了当然没有明确初始化值的选项.
Fwiw:我非常同意你的观点,这是无益的行为.您可能会在connect.microsoft.com找到接受的耳朵,在那里发布您的功能请求,VB.NET团队将会看到它.客户以及MSFT内部都有强烈的支持,使VB.NET和C#功能相当.如果您发布了反馈报告的链接,那么我很乐意将其投票.