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