如果我使用Using
语句初始化一个类,是否有必要在提前终止时调用它的Close方法?
Using xmlstream As New MemoryStream()
Try
'Do runtime operation
Catch ex As Exception
Console.WriteLine("Could not fill dataset. REASON: " & ex.Message)
xmlstream.Close() '<- NECESSARY????
Environment.Exit(-1) '<- Early termination!
End Try
'DO STUFF
End Using
答案 0 :(得分:3)
不是没有必要。根据{{3}}
&#34; using语句自动关闭流,并在使用它的代码完成后调用对象上的Dispose&#34;
说过在使用块中包含Environment.Exit
不是一个好主意,因为这不会调用Close
或Dispose
。相反,你应该将它重构为一个返回True或False的函数,并根据该返回值来决定是否退出
答案 1 :(得分:1)
作为一种消化,你可以用这种方式重写。关于,你问的是,程序会将方法的关闭留给O.S。
Try
Using xmlstream As New MemoryStream()
'Do runtime operation
End Using
Catch ex As Exception
Console.WriteLine("Could not fill dataset. REASON: " & ex.Message)
Environment.Exit(-1)
End Try
'DO STUFF
答案 2 :(得分:0)
反编译器显示在Dispose
- 语句末尾调用的Using
方法实现如下:
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
它应该在消息框中显示“Disposing”,但不是!如果您注释掉Environment.Exit(-1)
,则会显示该消息。
Using
语句是作为Try Finally
语句实现的,因此您的代码相当于两个嵌套的Try ... End Try
块。 Microsoft的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)
!