1

次のコードを検討してください。

On Error Goto ErrorHandler

Using sr As StreamReader = New StreamReader(OpenFile)
    str = sr.ReadToEnd
    sr.Close()
End Using

Exit Sub

ErrorHandler:

ブロック内にエラーがある場合Using、オブジェクトをどのようにクリーンアップしsrますか?

srオブジェクトはスコープ内にないErrHandlerため、sr.Close() を呼び出すことはできません。エラーが発生した場合でも、Usingブロックはリソースを自動的にクリーンアップしますか?

4

3 に答える 3

4

Closecodeka が言うように、srを呼び出す必要はありません。自動的に呼び出され、エラーが発生した場合も含まれます。ステートメントを使用するusingと、 と同じ機能が得られますtry ... finally ... end try

そして、他の質問への回答でわかるように、On Erroretc を使用するべきではありません:

Try
  Using sr as StreamReader ...
     ...
  End Using
Catch ex as SomeException
...
End Try
于 2010-06-15T08:28:01.803 に答える
1

このコード:

Using sr As StreamReader = New StreamReader(OpenFile)
    str = sr.ReadToEnd
    sr.Close()
End Using

これと本当に同等です:

Dim sr As StreamReader = Nothing
Try
    sr = New StreamReader(OpenFile)
    sr.Close() ' notice: unnecessary '
Finally
    sr.Close()
End Try

Finallyブロック内のコードは、メソッドが返される前に常に実行されることに注意してください(メソッドが独自の例外をスローした場合は、非常に危険です)。したがって、ブロックsr.Close内にある行は不要です (例外がスローされるかどうかに関係なく呼び出されるため、/を使用する同等のコードでは不要であることに注意してください)。UsingTryFinallysr.CloseFinally

于 2010-06-15T08:34:50.030 に答える
1

はい、using ブロックは自動的に呼び出されますIDisposable.Dispose(aStreamReaderは を呼び出すのと同じCloseです) ので、何もする必要はありません (それが using ブロックの要点です!)

于 2010-06-15T08:18:51.623 に答える