VB.NET: вопрос об использовании блока - PullRequest
1 голос
/ 15 июня 2010

Рассмотрим код:

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 какие-либо ресурсы автоматически, даже если произошла ошибка?

Ответы [ 3 ]

4 голосов
/ 15 июня 2010

Как говорит кодека, вам не нужно звонить Close на ср.Он будет вызван автоматически, и это включает в себя, если есть ошибка.Использование оператора using дает вам ту же функциональность, что и try ... finally ... end try.

. И, как вы видите в ответах на другой вопрос, вы не должны использовать On Error и т. Д. Просто сделайте:

Try
  Using sr as StreamReader ...
     ...
  End Using
Catch ex as SomeException
...
End Try
1 голос
/ 15 июня 2010

Этот код:

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, имеющаяся в вашем блоке Using, является лишней (обратите внимание, что в эквивалентном коде, использующем Try / Finally, это не нужно, поскольку sr.Close будет вызываться в Finally независимо от того, исключение выдается или нет).

1 голос
/ 15 июня 2010

Да, блок using автоматически вызовет IDisposable.Dispose (что для StreamReader совпадает с вызовом Close), поэтому вам ничего не нужно делать (это целая точка изиспользуя блоки!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...