我想知道什么时候应该而且不应该在USING块中包装东西.
根据我的理解,编译器将其转换为try/finally,最后在对象上调用Dispose().
我总是使用围绕数据库连接和文件访问的USING,但它更多的是习惯而不是100%的理解.我知道你应该明确(或使用)Dispose()控制资源的对象,以确保它们立即释放,而不是每当CLR感觉到它时,但那是我理解失败的地方.
IDisposables在超出范围时是否被处置掉?
当我的对象使用Dispose来整理自己时,我只需要使用USING吗?
谢谢
编辑:我知道USING关键字上还有其他一些帖子,但我对CLR的相关答案更感兴趣,内部究竟是什么
安德鲁
不,IDisposable
物品在超出范围时不会被处理掉.正是出于这个原因,我们需要IDisposable
- 进行确定性清理.
他们最终会收集垃圾,如果有终结器,它(可能)会被调用 - 但这可能是将来很长一段时间(不适合连接池等).垃圾收集取决于内存压力 - 如果没有什么需要额外的内存,则无需运行GC循环.
有趣的是(也许)有些情况下"使用"是一种痛苦 - 当有问题的类Dispose()
有时会抛出异常时.WCF是这个的罪犯.我已经讨论过这个话题(用一个简单的解决方法)在这里.
基本上 - 如果类实现IDisposable
,并且您拥有一个实例(即您创建它或其他任何实例),那么确保它被处置是您的工作.这可能意味着通过"使用",或者它可能意味着将其传递给承担责任的另一段代码.
我实际上已经看到了类型的调试代码:
#if DEBUG ~Foo() { // complain loudly that smoebody forgot to dispose... } #endif
(Dispose
电话里面GC.SuppressFinalize
)
"当IDisisposables超出范围时,它们是不会被处置掉的吗?"
不可以.如果IDisposable对象是可终结的,这不是一回事,那么它将在收集垃圾时完成.
哪个可能很快或几乎从不.
Jeff Richter的C#/ CLR书非常适合所有这些内容,而且框架设计指南书也很有用.
当我的对象使用Dispose来整理自己时,我只需要使用USING吗?
当对象实现IDisposable时,您只能使用'using'.如果您尝试不这样做,编译器将反对.