“文件和字体是访问非托管资源的托管类型的示例(在本例中为文件句柄和设备上下文)。还有许多其他类型的非托管资源和类库类型封装它们。所有这些类型必须实现IDisposable通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。“ - MSDN
是否有这样的案例列表(访问非托管资源的托管类型,如FILE和FONT,......)应该使用USING语句?
答案 0 :(得分:6)
任何实现IDisposable
的类型都应使用using
。
更新(以回应评论):using
应围绕IDisposable
类型的实例,假设在更大的范围内不需要它。
答案 1 :(得分:2)
每当你有一个需要确定性清理的资源时,你希望它在你完成它之后就有机会被“毁掉”。
更详细地说,IDisposible接口主要试图解决.net语言中缺少“删除”关键字的问题。因为CLR是垃圾收集的,所以你永远不知道何时运行对象的终结器(析构函数)。在开始发布托管资源之前,GC可以随心所欲地等待它。
但是,许多托管资源包装了底层的有限资源 - 内存不是必须分配和释放的唯一内容。如上所述,文件句柄是一个;数据库处理另一个 - 有无数的例子。为了避免混乱的清理惯用语,IDisposible模式用于说“请释放你的有限资源,我已经完成了它们”。因为它内置于框架中,它通过“使用”获得特殊语言支持,以帮助确保您永远不会忘记调用Dispose方法,从而“泄漏”非托管资源。
这并不意味着所有 IDisposible实施者都应该包含在使用中 - 如果您保留了引用,并且将来需要它们,您当然不应该将它们包装起来,就像您一样导致底层资源过早释放。完成对象后,只调用 ,只有在使用范围结束后知道你已经完成时才包装“使用”。
正如我们所期望的那样,具有确定性破坏的语言(例如C ++ / CLI)不需要“使用”。非堆C ++ / CLI对象的Dispose方法在超出范围时会自动调用,模仿模式尝试捕获的析构函数行为。
答案 2 :(得分:2)
没有。 MSDN文章刚刚告诉您,在使用IDisposable
对象时应考虑使用它。有很多框架类实现了IDisposable
,你肯定会定义许多自己的框架类。
答案 3 :(得分:2)
当类型实现using
接口时,正确的方法始终使用IDisposable
语句,但知道规则的例外。
已知例外:
Application
类管理)SystemPens.*
,SystemBrushes.*
(这些静态实例在内部缓存)Icons.*
(这些静态实例在内部缓存)Registry.*
(这些静态实例在内部缓存)AutoResetEvent
,ManualResetEvent
(实际应该被处理掉,但是如果你这样做的话,请小心非常因为它可能导致比赛条件)已知异常列表肯定不完整。
答案 4 :(得分:0)
简单的规则是“任何时候你有一个资源应该在使用后立即释放,而不是在未来的某个未知点,当垃圾收集器来解放它时。”
所有有限的资源,基本上是非托管或管理的。文件,网络套接字,数据库连接,注册表句柄,任何不应无限期浮动的东西。