如果我在第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
答案 0 :(得分:2)
因为您只声明了循环变量,因此在每次迭代时都会导致Nothing
的正确值:
Dim currentrow As String() = Nothing
甚至更好
Dim currentrow As String() = MyParser.ReadFields()
“Dim”本身,没有显式初始化,将被优化为冗余。
即使您指定Nothing
,它也会在每次迭代时重置为Nothing
。如果您只声明变量,那么即使您之后使用Console.Write
或MessageBox.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。