是否有必要致电"关闭"当在'内使用'早期流程终止的声明?

时间:2014-09-08 14:03:11

标签: .net vb.net dispose using-statement

如果我使用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

3 个答案:

答案 0 :(得分:3)

不是没有必要。根据{{​​3}}

&#34; using语句自动关闭流,并在使用它的代码完成后调用对象上的Dispose&#34;

说过在使用块中包含Environment.Exit不是一个好主意,因为这不会调用CloseDispose。相反,你应该将它重构为一个返回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)

另请参阅:Calling Environment.Exit() Within a Using Block