如果我用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
发布于 2014-09-08 06:09:53
不,没有必要。根据IDisposable.Dispose方法文档
“using语句自动关闭流,并在使用它的代码完成后调用对对象的Dispose”
话虽如此,在Using块中使用Environment.Exit
并不是个好主意,因为它不调用Close
,实际上也不调用Dispose
。相反,您应该将其重构为返回True或False的函数,并对返回值进行操作,以决定是否退出
发布于 2014-09-08 06:08:44
作为建议,您可以用这种方式重写。关于,你问的,程序将把方法的结束留给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
发布于 2014-09-08 06:14:59
反编译器显示在Using
-statement末尾调用的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
它应该在消息框中显示“处理”,但不显示!如果您注释掉了Environment.Exit(-1)
,就会显示消息。
Using
语句是作为Try Finally
语句实现的,因此您的代码相当于两个嵌套的Try ... End Try
块。微软的Environment.Exit法文档说:“.如果从一个try或最终块调用了Exit,那么任何catch块中的代码都不会执行。”但是,关于最终块是否被执行的文档还不清楚。然而,Try...Catch...Finally语句的文档显示:
控件不会在下列情况下从Try或Catch块传递到相应的Finally块: 在Try或Catch块中遇到一个End语句。 ·在Try或Catch块中抛出一个StackOverflowException。
结束语句的文档中写着:“End语句调用系统命名空间中的Environment类的Exit方法。”
最后,把这些信息放在一起,我们可以说:
是的,在调用xmlstream.Close()
Environment.Exit(-1)
**!**之前,您必须先调用
https://stackoverflow.com/questions/25726094
复制相似问题