如果通用集合被实例化以包含iDisposable项目,那么这些项目是否会被处置?

mbe*_*ish 4 .net c# idisposable

例如:

Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();
Run Code Online (Sandbox Code Playgroud)

如果我没有明确地将每个项目出列并单独处理它们,那么在调用Clear()时是否会处理剩余的项目?队列被垃圾收集时怎么样?

假设答案是"不",那么最佳做法是什么?您是否必须始终遍历队列并处理每个项目?

这可能会变得很难看,特别是如果你必须尝试..最终围绕每个dispose,以防万一抛出异常.

编辑

因此,对于通用集合的用户而言,如果项目是Disposable(意味着他们可能正在使用不会被垃圾收集器清理的非托管资源),那么似乎负担很重,那么:

  1. 从集合中删除项目时,请确保Dispose()它.
  2. 不要打电话给Clear().迭代收集并处理每个项目.

也许通用集合的文档应该提到这一点.

Sco*_*man 5

在泛型集合实际上并不知道它们所包含的对象的类型任何事情,所以调用清除不会导致它们对项目调用Dispose().一旦集合本身被处理掉,GC将最终处置它们,前提是没有其他任何东西对其中一个项目有活跃的引用.

如果你想确保当你调用你将需要获得自己的收藏,并覆盖相应的方法和你自己打的电话收集清除的对象都被称为他们的Dispose方法.