2012-11-06 2 views
2

currentrow = MyParser.ReadFields() 줄에 중단 점을 배치하면 currentrow에는 여전히 파일에서 파싱 된 이전 줄의 값이 포함됩니다. currentrow = MyParser.ReadFields() 이 실행 된 후 현재 파일 줄 값이 저장됩니다.배열의 값이 while 루프에 유지되는 이유는 무엇입니까? (VB.NET)

현재 루프가 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

이것은 File.Exists()를 잘못 사용하는 것입니다. 파일을 열고 대신 FileNotFoundException을 처리하십시오. –

+0

또한 루프를 올바르게 구성하는 한 currentrow가 여전히 이전 값을 유지하는 것이 바람직하지 않습니까? –

+0

@JoelCoehoorn : 예외 잡기와 File.Exists()로 확인하는 것의 차이에 관해서 나에게 좀 더 많은 정보를 줄 수 있습니까? 왜 후자가 좋지 않은지? – user1620141

답변

2

모든 반복에 Nothing의 정확한 값을 초래하는이에 대한 당신은, 루프 변수를 선언했기 때문에 :

Dim currentrow As String() = Nothing 

또는

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

를 더 나은 "을 어둡게 "명시 적 초기화없이 자체적으로 중복 된 것으로 최적화됩니다.

Nothing을 지정하더라도 모든 반복마다 항상 Nothing으로 재설정됩니다. 변수 만 선언하면 나중에 Console.Write 또는 MessageBox.Show을 사용하더라도 항상 "잘못된"이전 값이 포함됩니다.

부작용을 피하기 위해 항상 루프 변수에 기본값을 지정하십시오. 할당되지 않은 지역 변수 '여기서 variableName'의 사용 :

(!) 참고 C#을 compiler warning CS0165이 오류 소스를 방지 할 수 있습니다.

그래서 할당되지 않은 변수를 할당하려고 시도하면 C#으로 컴파일 할 수 없습니다. VB.NET이 허용하는 이유를 모르겠습니다.

+0

답변 해 주셔서 감사합니다. 루프의 각 반복에서 currentrow가 다시 생성되지 않습니까? 명확히하기 위해 루프로 들어가는 첫 번째 순간에 currentrow가 선언됩니다. 그렇다면 왜 반복문의 각 반복을 다시 선언하지 않습니까? – user1620141

+2

@ user1620141 : 언어 사양이나 블로그를 보여 드리고 싶지만 불행히도 찾을 수 없습니다. 'currentrow'는'currentrow = MyParser.ReadFields()'에서 다시 할당 될 것이고, 선언 라인이 아니라 최적화 된 것이기 때문에 루프에 중복되어 있기 때문에 생략됩니다. 그러나 그것은 오류의 원인 일 수 있습니다. –

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을 참조하십시오.

+0

예제 및 질문에 대한 링크를 제공해 주셔서 감사합니다. 호기심에서이 동작이 VB.NET에 독점적인지 또는 출력이 C#에서 동일 할 것인지 알고 있습니까? – user1620141

+0

C#에서는 변수가 할당되기 전에 변수에 액세스 할 수 없습니다. –

관련 문제