Декомпилятор показывает, что Dispose
метод вызывается в конце Using
-statement реализуется как это :
Public Sub Dispose() Implements IDisposable.Dispose
Me.Close()
End Sub
Он реализуется базовым классом System.IO.Stream
.
Однако, поскольку вы звоните Environment.Exit(-1)
, код отменяется, а метод Dispose
НЕ ЗВОНИТЕ! Вы можете проверить его с помощью этого класса:
Class Disp
Implements IDisposable
Public Sub Dispose() Implements IDisposable.Dispose
MsgBox("Disposing")
End Sub
End Class
и этот код:
Private Sub btnTest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTest.Click
Dim x = 100, y = 0, z = 0
Using d = New Disp()
Try
z = x \ y
Catch ex As Exception
Environment.Exit(-1)
End Try
End Using
End Sub
Он должен показывать «Располагая» в окне сообщения, но не делает! Если вы прокомментируете Environment.Exit(-1)
, появится сообщение.
Оператор Using
выполнен в виде инструкции Try Finally
, поэтому ваш код эквивалентен двум вложенным блокам Try ... End Try
. Документация Microsoft для Environment.Exit Method гласит: «... Если Exit вызывается из блока try или finally, код в любом блоке catch не выполняется ...». Но в документации неясно, выполняется ли блок finally или нет. Документация Try...Catch...Finally Statement, однако, говорит:
управление не проходит из блока Try или Выгоды к соответствующим Наконец блоку в следующих случаях:
• концевого заявления встречаются в пробном или Вылове блок.
• Исключение StackOverflowException в блоке Try or Catch.
В документации для End Statement говорится: «Оператор End вызывает метод Exit класса Environment в пространстве имен System. ...».
Наконец, вкладывая эти информации вместе, мы можем сказать:
Да, вы должны позвонить xmlstream.Close()
перед вызовом Environment.Exit(-1)
!
Смотрите также: Calling Environment.Exit() Within a Using Block
Нет, End Using будет обслуживать для него –