.net 标注的变量只有在给定初始值时才重新标注尺寸吗?

.net 标注的变量只有在给定初始值时才重新标注尺寸吗?,.net,.net,我只是遇到了一些我在.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}", i

我只是遇到了一些我在.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

这是在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
变量都具有块作用域,因此其值保持不变

你说你想要一些关于这种行为的文档。在关于的一节中,它说:

即使变量的范围仅限于一个块,其生存期仍然是整个过程的生存期。如果在过程中多次输入块,每个块变量将保留其以前的值。为了避免在这种情况下出现意外结果,最好在块的开头初始化块变量

要生成所需的输出,必须修改代码以显式重新初始化
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

但是无论你做什么,请给你的变量一个类型

Dim someId
置于循环外部,查看其变化情况。