应使用USING语句的案例列表

时间:2009-05-27 13:57:23

标签: .net idisposable using-statement unmanagedresources

“文件和字体是访问非托管资源的托管类型的示例(在本例中为文件句柄和设备上下文)。还有许多其他类型的非托管资源和类库类型封装它们。所有这些类型必须实现IDisposable通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。“ - MSDN

是否有这样的案例列表(访问非托管资源的托管类型,如FILE和FONT,......)应该使用USING语句?

5 个答案:

答案 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语句,但知道规则的例外

已知例外

  • 主窗体(Windows窗体应用程序,因为它由Application类管理)
  • SystemPens.*SystemBrushes.*(这些静态实例在内部缓存)
  • Icons.*(这些静态实例在内部缓存)
  • Registry.*(这些静态实例在内部缓存)
  • AutoResetEventManualResetEvent(实际应该被处理掉,但是如果你这样做的话,请小心非常因为它可能导致比赛条件)

已知异常列表肯定不完整。

答案 4 :(得分:0)

简单的规则是“任何时候你有一个资源应该在使用后立即释放,而不是在未来的某个未知点,当垃圾收集器来解放它时。”

所有有限的资源,基本上是非托管或管理的。文件,网络套接字,数据库连接,注册表句柄,任何不应无限期浮动的东西。