【发布时间】:2011-02-12 15:45:45
【问题描述】:
由于 C# 使用垃圾收集。什么时候需要使用 .Dispose 来释放内存?
我知道有几种情况,所以我会尝试列出我能想到的。
- 如果我关闭一个包含 GUI 类型对象的表单,这些对象是否会被取消引用并因此被收集?
- 如果我使用 new 创建一个本地对象,我应该在方法退出之前处理它还是让 GC 处理它?在这种情况下有什么好的做法?
- 在哪些情况下强制 GC 是可以理解的?
- GC 是否在收集对象时收集事件?
【问题讨论】:
-
通常 IDisposable 是为非托管资源实现的,当对象被 GC 清理时,这些资源不会被返回、关闭或优化使用 - 托管对象总是被 GC 清理。请参阅 IDisposable @ msdn.microsoft.com/en-us/library/system.idisposable.aspx 对于 #2,无论您是否调用 Dispose(),GC 都会处理托管代码中的对象。无论您是否调用 Dispose(),都会收集 #1 和内置的“GUI 类型对象”。另见msdn.microsoft.com/en-us/magazine/bb985010.aspx
-
@George:我不认为它们与其中任何一个重复。我也许应该澄清一下,因为我的主要问题是什么时候应该明确释放内存,什么时候不应该担心它。答案似乎很明确,那就是,总是 Dispose of an object if it can be dispose 是首选模式。
标签: c# .net memory-management memory-leaks