有人可以解释一下如果您不Dispose
一些IDisposable
实体(通过使用
或直接 Dispose
调用)?
这是否总是导致内存泄漏?如果是,C#
内存泄漏是否类似于C++
内存泄漏,它们很容易导致崩溃还是 C#
沙箱从这个角度来看更安全?
谢谢。
最佳答案
这完全取决于所讨论的对象。
有四个五个对象可能实现IDisposable
的原因:
拥有原生资源。
如果是这样,它应该在其终结器中调用Dispose
,因此如果您忘记处置它,将会发生的所有情况都是 native 资源持续时间超过必要时间。
如果您一次创建大量此类对象并且不处置它们,您可能会耗尽 native 资源。它拥有一次性的托管对象。
它拥有的对象也将属于这些类别之一;查看相关类别。它有一个不会自然释放的对自身的持久引用(例如,它处理一个
static
事件)
dispose 方法将清除此引用(例如,注销事件处理程序)
如果是这样,不调用Dispose
将导致它永远持续下去。它继承了一个可释放的基类,例如
Stream
或Component
,但实际上并不需要被释放。 (例如,MemoryStream
)
如果是这样,不调用Dispose
是无害的,除非将来类发生变化。它在其
Dispose
方法中执行一些操作,人们应该在using
语句中调用这些操作(例如,using (Html.BeginForm() { ...
)
如果是这样,不处置该对象将破坏其完成该操作的全部目的。
关于C# 处理 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462742/