C#处理IDisposable

Yip*_*Yay 4 c# dispose memory-leaks idisposable

有人可以解释如果你不是Dispose某个IDisposable实体(通过using或直接Dispose电话)可能会发生什么?

这是否总是导致内存泄漏?如果是,C#内存泄漏类似于C++内存泄漏,C#从这个角度来看,它们很容易导致崩溃或沙箱更安全?

谢谢.

SLa*_*aks 12

它完全取决于所讨论的对象.

对象可能实现的原因有四个IDisposable:

  1. 它拥有本地资源.
    如果是这样,它应该调用Dispose它的终结器,所以如果你忘记处理它会发生的一切就是本机资源的使用时间超过了必要的时间.
    如果您一次创建大量此类对象并且不处置它们,则可能会耗尽本机资源.

  2. 它拥有一次性的托管对象.
    它拥有的对象也属于这些类别之一; 看相关类别.

  3. 它有一个持久的自身引用,不会自然释放(例如,它处理一个static事件)
    dispose方法将清除此引用(例如,注销事件处理程序)
    如果是这样,不调用Dispose将导致它永远持续.

  4. 它继承了一次性基类,例如StreamComponent,但实际上并不需要处理.(例如,MemoryStream)
    如果是这样,Dispose除非课程在将来发生变化,否则不会打电话是无害的.

  5. 它执行了一些动作Dispose方法,人们应该在调用using语句(如using (Html.BeginForm() { ... })
    如果是这样,不处置的对象将打败它的整个目的,就是做那个动作.

  • 像TransactionScope这样的东西是100%管理的 - 没有发布本机资源.通常,它根本不是传统意义上的"资源",而是暴露出"这个对象的生命已经结束"的逻辑 (2认同)