反编译器显示Using-statement末尾调用的Dispose方法是这样实现的:
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 块。微软的Environment.Exit Method 文档说:“......如果从 try 或 finally 块调用 Exit,则任何 catch 块中的代码都不会执行......”。但是文档不清楚 finally 块是否被执行。但是,Try...Catch...Finally Statement 的文档说:
在以下情况下,控件不会从 Try 或 Catch 块传递到相应的 finally 块:
•在 Try 或 Catch 块中遇到 End 语句。
•在 Try 或 Catch 块中引发 StackOverflowException。
End Statement 的文档说:“End 语句调用 System 命名空间中 Environment 类的 Exit 方法。...”。
最后,将这些信息放在一起,我们可以说:
是的,您必须先致电xmlstream.Close(),然后再致电Environment.Exit(-1)!
另见:Calling Environment.Exit() Within a Using Block