C# 处理 IDisposable

标签 c# memory-leaks dispose idisposable

有人可以解释一下如果您不Dispose一些IDisposable实体(通过使用或直接 Dispose调用)?

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

谢谢。

最佳答案

这完全取决于所讨论的对象。

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

  1. 拥有原生资源。
    如果是这样,它应该在其终结器中调用Dispose,因此如果您忘记处置它,将会发生的所有情况都是 native 资源持续时间超过必要时间。
    如果您一次创建大量此类对象并且不处置它们,您可能会耗尽 native 资源。

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

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

  4. 它继承了一个可释放的基类,例如StreamComponent,但实际上并不需要被释放。 (例如,MemoryStream)
    如果是这样,不调用 Dispose 是无害的,除非将来类发生变化。

  5. 它在其 Dispose 方法中执行一些操作,人们应该在 using 语句中调用这些操作(例如,using (Html.BeginForm() { ... )
    如果是这样,不处置该对象将破坏其完成该操作的全部目的。

关于C# 处理 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462742/

相关文章:

c# - 使用 .NET 4.0、3.5 时,UnmanagedFunctionPointer 会导致堆栈溢出

Chrome/Firefox 中的 Javascript 内存使用和调试(雷区)

c# - 具有 CancellationTokenSource 的 channel 在处理后出现超时内存泄漏

java - 通过代码处理 JDialog,不要让用户关闭它

c# - ASP.NET MVC : How to post an array of textboxes to a controller

c# - GUI 对象何时需要调用?

c# - Linq 在 C# 中的列表中添加列表

wpf - 30 行 WPF 应用程序泄漏内存

c# - 我要找回我的内存!我怎样才能真正处置一个控件?

c# - Dispose() 如何在我的 Controller 和 Repository 类中工作