首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在早期进程终止时,是否有必要在‘使用’语句中调用"Close“?

在早期进程终止时,是否有必要在‘使用’语句中调用"Close“?
EN

Stack Overflow用户
提问于 2014-09-08 14:03:10
回答 3查看 144关注 0票数 1

如果我用Using语句初始化一个类,是否有必要在早期终止时调用它的Close方法?

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-08 14:09:53

不,没有必要。根据IDisposable.Dispose方法文档

“using语句自动关闭流,并在使用它的代码完成后调用对对象的Dispose”

话虽如此,在Using块中使用Environment.Exit并不是个好主意,因为它不调用Close,实际上也不调用Dispose。相反,您应该将其重构为返回True或False的函数,并对返回值进行操作,以决定是否退出

票数 3
EN

Stack Overflow用户

发布于 2014-09-08 14:08:44

作为建议,您可以用这种方式重写。关于,你问的,程序将把方法的结束留给O.S。

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-09-08 14:14:59

反编译器显示在Using-statement末尾调用的Using方法如下所示:

代码语言:javascript
运行
复制
Public Sub Dispose() Implements IDisposable.Dispose
    Me.Close()
End Sub

它由基类System.IO.Stream实现。

但是,由于您正在调用Environment.Exit(-1),所以代码将被中止,而Dispose方法也不会被调用!您可以用这个类来测试它:

代码语言:javascript
运行
复制
Class Disp
    Implements IDisposable
    Public Sub Dispose() Implements IDisposable.Dispose
        MsgBox("Disposing")
    End Sub
End Class

这个代码是:

代码语言:javascript
运行
复制
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)**!**之前,您必须先调用

另见:在使用块中调用Environment.Exit()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25726094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档