当前位置:  开发笔记 > 编程语言 > 正文

C#USING关键字 - 何时何地不使用它?

如何解决《C#USING关键字-何时何地不使用它?》经验,为你挑选了2个好方法。

我想知道什么时候应该而且不应该在USING块中包装东西.

根据我的理解,编译器将其转换为try/finally,最后在对象上调用Dispose().

我总是使用围绕数据库连接和文件访问的USING,但它更多的是习惯而不是100%的理解.我知道你应该明确(或使用)Dispose()控制资源的对象,以确保它们立即释放,而不是每当CLR感觉到它时,但那是我理解失败的地方.

IDisposables在超出范围时是否被处置掉?

当我的对象使用Dispose来整理自己时,我只需要使用USING吗?

谢谢

编辑:我知道USING关键字上还有其他一些帖子,但我对CLR的相关答案更感兴趣,内部究竟是什么

安德鲁



1> Marc Gravell..:

不,IDisposable物品在超出范围时不会被处理掉.正是出于这个原因,我们需要IDisposable- 进行确定性清理.

他们最终会收集垃圾,如果有终结器,它(可能)会被调用 - 但这可能是将来很长一段时间(不适合连接池等).垃圾收集取决于内存压力 - 如果没有什么需要额外的内存,则无需运行GC循环.

有趣的是(也许)有些情况下"使用"是一种痛苦 - 当有问题的类Dispose()有时会抛出异常时.WCF是这个的罪犯.我已经讨论过这个话题(用一个简单的解决方法)在这里.

基本上 - 如果类实现IDisposable,并且您拥有一个实例(即您创建它或其他任何实例),那么确保它被处置是您的工作.这可能意味着通过"使用",或者它可能意味着将其传递给承担责任的另一段代码.

我实际上已经看到了类型的调试代码:

#if DEBUG
    ~Foo() {
        // complain loudly that smoebody forgot to dispose...
    }
#endif

(Dispose电话里面GC.SuppressFinalize)


哦,那很不幸.

2> Will Dean..:

"当IDisisposables超出范围时,它们是不会被处置掉的吗?"

不可以.如果IDisposable对象是可终结的,这不是一回事,那么它将在收集垃圾时完成.

哪个可能很快或几乎从不.

Jeff Richter的C#/ CLR书非常适合所有这些内容,而且框架设计指南书也很有用.

当我的对象使用Dispose来整理自己时,我只需要使用USING吗?

当对象实现IDisposable时,您只能使用'using'.如果您尝试不这样做,编译器将反对.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有