.net 在循环中声明的变量在循环的每次迭代中保持值

.net 在循环中声明的变量在循环的每次迭代中保持值,.net,vb.net,for-loop,.net,Vb.net,For Loop,我不知道这是一个bug还是一个特性 For i = 0 To 4 Dim strTest As String If i = 0 Then strTest = "test value" End If Console.WriteLine(strTest) Next 我认为,通过在循环中声明字符串,它不会保持其值,但在运行此代码后,控制台有5行“测试值”。如果相反,我声明strTest如下: Dim strTest As String= "" 那么字

我不知道这是一个bug还是一个特性

For i = 0 To 4
    Dim strTest As String
    If i = 0 Then
        strTest = "test value"
    End If
    Console.WriteLine(strTest)
Next
我认为,通过在循环中声明字符串,它不会保持其值,但在运行此代码后,控制台有5行“测试值”。如果相反,我声明strTest如下:

Dim strTest As String= ""
那么字符串就不会保持它的值——这就是我最初期望函数运行的方式

这是编译器的故意行为吗?

“按设计破坏”

注意:即使变量的范围仅限于一个块,其 生命周期仍然是整个过程的生命周期。如果你进入街区 在该过程中,每个块变量会多次保留其 以前的值。在这种情况下,为了避免意外的结果,这是明智的 在块的开头初始化块变量


这里的“块”是FOR循环的主体,您将在循环的一个pr.迭代中输入它。因此strTest将保留在第一次迭代中设置的值(“测试值”),用于下一次迭代(1、2、3、4)。

这是很好的指定行为。根据本协议第10.9节:

每次输入循环体时,都会对该体中声明的所有局部变量创建一个新的副本,并将其初始化为变量的先前值。循环体中对变量的任何引用都将使用最近制作的副本

请注意,如果使用捕获局部变量的lambda表达式,则它是“新副本”这一事实可能很重要。同一节后面部分:

创建lambda时,它会记住创建变量时变量的当前副本


(有一个例子说明了这一点。)

如果您觉得这是一种意外行为,我完全同意,但可以说这是一个对性能进行微观优化的机会。DIM语句实际上只在这里分配内存,因此如果有足够好的编译器,它实际上是免费的(无操作)。如果它意味着一个初始化,它将至少需要一次操作-重复。我刚刚注意到c#中也有同样的行为,这也是预期的吗?@BradyMoritz:lambda表达式的行为是相同的,但问题中VB的等效代码,但在c#中,不会编译为
strTest
不会被明确指定。如果你认为你看到了一些不同的东西,我建议你用C#问一个新问题,然后在这里添加另一个链接到它的评论。