2

如果我在 line 放置一个断点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
4

2 回答 2

2

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

Dim currentrow As String() = Nothing

甚至更好

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

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

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

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

旁注C# 通过编译器警告 CS0165 : Use of unassigned local variable 'variablename'避免了这个错误源。

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

于 2012-11-06T21:52:10.860 回答
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

(*)匿名例程/闭包会影响这一点。请参阅我的单独问题

于 2012-11-07T09:29:44.793 回答