为什么数组中的值保留在while循环中? (VB.NET)

时间:2012-11-06 21:50:58

标签: asp.net vb.net parsing file-io

如果我在第currentrow = MyParser.ReadFields() 行放置断点,则currentrow仍然包含从文件解析的上一行的值。执行currentrow = MyParser.ReadFields() 后,将存储当前文件行值。

由于currentrow是在While循环中声明的,所以当重新进入While循环时,前一个currentrow值是否应该超出范围?为什么currentrow仍然保留文件中最后一行的值?

我是否需要将Dim currentrow As String() 更改为Dim currentRow() = New String() {}?为什么呢?

If File.Exists(filename) Then
        Using MyParser As New FileIO.TextFieldParser(filename)
            MyParser.TextFieldType = FileIO.FieldType.Delimited
            MyParser.SetDelimiters("~")
            While Not MyParser.EndOfData
                Try
                    Dim currentrow As String()
                    'at this point, currentrow still contains prev values
                    currentrow = MyParser.ReadFields()
                Catch 
                End Try
            End While
        End Using
End If

2 个答案:

答案 0 :(得分:2)

因为您只声明了循环变量,因此在每次迭代时都会导致Nothing的正确值:

Dim currentrow As String() = Nothing

甚至更好

Dim currentrow As String() = MyParser.ReadFields()

“Dim”本身,没有显式初始化,将被优化为冗余。

即使您指定Nothing,它也会在每次迭代时重置为Nothing。如果您只声明变量,那么即使您之后使用Console.WriteMessageBox.Show,它也将始终包含“错误的”旧值。

所以总是在循环变量中指定一个默认值以避免副作用。

Sidenote C#使用compiler warning CS0165来避免此错误来源:使用未分配的本地变量'variablename'

因此,如果您在分配之前尝试使用该未分配的变量,则甚至无法使用C#进行编译。我不知道VB.NET为什么允许它。

答案 1 :(得分:1)

请记住,VB中的所有变量都具有它们声明的块的范围,但是整个例程的生命周期(*)(实际上从它们被声明到例程的末尾),并且它们是始终初始化为Nothing,无论对实际类型的意义如何。

Dim outer As Integer
For i = 1 To 2
 Dim inner As Integer
 Try
  Dim inner2 As Integer
  Do
   Dim inner3 As Integer
   While True
    Dim inner4 As Integer
    Console.WriteLine(outer & ", " & inner & ", " & inner2 & ", " & inner3 & ", " & inner4)
    outer = i
    inner = i
    inner2 = i
    inner3 = i
    inner4 = i
    Exit While
   End While
  Loop Until True
 Catch
 End Try
Next

以上输出:

0, 0, 0, 0, 0
1, 1, 1, 1, 1

(*)匿名例程/闭包会影响这一点。查看我的separate question