2

行にブレークポイントを設定すると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()

明示的な初期化を行わない「薄暗い」自体は、冗長として最適化されます。

を割り当てても、反復ごとにNothing常にリセットされます。変数のみを宣言すると、使用する場合でも、後でNothing使用する場合でも、常に「間違った」古い値が含まれます。Console.WriteMessageBox.Show

したがって、副作用を回避するために、ループ変数には常にデフォルト値を割り当ててください。

補足C#は、コンパイラの警告CS0165 割り当てられていないローカル変数'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 に答える