我只是碰到了一些我在.NET中无法预料到的行为:
Dim switch = True
Dim items = {1, 2, 3, 4, 5, 6}
For Each item In items
Dim someId As Integer
If switch Then
switch = False
someId = 123
End If
Console.WriteLine("Item: {0}, SomeId: {1}", item, someId)
Next
代码的输出是:
Item: 1, SomeId: 123
Item: 2, SomeId: 123
Item: 3, SomeId: 123
Item: 4, SomeId: 123
Item: 5, SomeId: 123
Item: 6, SomeId: 123
虽然我原以为:
Item: 1, SomeId: 123
Item: 2, SomeId: 0
Item: 3, SomeId: 0
Item: 4, SomeId: 0
Item: 5, SomeId: 0
Item: 6, SomeId: 0
如果你给出一个默认值,那么变量只会被重新标注?我在哪里可以找到有关此行为的文档?
编辑:我想我最困惑的事实是我在一个循环中,所以我认为预期的结果是我想要一个新分配的整数 someId
答案 0 :(得分:2)
这是设计在VB.NET中,在For
循环内声明的变量为每个后续循环迭代保留其值。
因此,您在第一次迭代时将someId
的值设置为123,并保持该值。 someId
变量在每个后续循环中都而不是重新初始化。
如果你在循环之外声明someId
,就会发生同样的事情,例如
Dim switch = True
Dim items = {1, 2, 3, 4, 5, 6}
Dim someId As Integer
For Each item In items
If switch Then
switch = False
someId = 123
End If
Console.WriteLine("Item: {0}, SomeId: {1}", item, someId)
Next
...但我会说,那么行为是可以预期的。但理由是相同的。在这两种情况下,someId
变量都具有块范围,因此其值仍然存在。
你说你想要一些这种行为的文档。在scope部分,它说:
即使变量的范围仅限于块,其寿命仍然是整个过程的寿命。如果在过程中多次输入块,则每个块变量将保留其先前的值。为避免在这种情况下出现意外结果,最好在块的开头初始化块变量。
要生成所需的输出,您必须修改代码以明确重新初始化someId
:
Dim switch = True
Dim items = {1, 2, 3, 4, 5, 6}
Dim someId As Integer
For Each item In items
If switch Then
switch = False
someId = 123
Else
someId = 0
End If
Console.WriteLine("Item: {0}, SomeId: {1}", item, someId)
Next
但无论你做什么,请,请给你的变量一个类型!