4

例如:

Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();

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

假设答案是“否”,那么最佳实践是什么?您是否必须始终遍历队列并处理每个项目?

这可能会变得很难看,特别是如果您必须尝试..finally 围绕每个处置,以防引发异常。

编辑

因此,通用集合的用户似乎有责任知道,如果这些项目是一次性的(意味着它们可能正在使用不会被垃圾收集器清理的非托管资源),那么:

  1. 当你从集合中移除一个项目时,确保你 Dispose() 它。
  2. 不要调用 Clear()。遍历集合并处理每个项目。

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

4

4 回答 4

5

通用集合实际上并不知道它们包含的对象的类型,因此调用 Clear 不会导致它们对项目调用 Dispose()。一旦集合本身被处置,GC 最终将处置它们,前提是没有其他任何东西对这些项目之一具有活动引用。

如果要确保在对集合调用 Clear 时调用对象的 Dispose 方法,则需要派生自己的集合并覆盖适当的方法并自己进行调用。

于 2009-01-30T19:04:07.417 回答
4

您预计它们何时被处置?集合如何知道其中是否存在对对象的其他引用?

于 2009-01-30T18:58:12.763 回答
2

让我看看我是否可以为此编写一个示例代码。

编辑:

以下代码实现了一个 IDisposable 队列:

class DisposableQueue<T>:Queue<T>,IDisposable where T:IDisposable

    #region IDisposable Members

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public virtual void Dispose(bool disposing) {
        if (disposing) {
            foreach (T type in this) {
                try
                {
                    type.Dispose();
                }
                finally {/* In case of ObjectDisposedException*/}
            }
        }
    }
    #endregion
}
于 2009-01-30T19:34:24.940 回答
0

正如其他人所说,这不会发生。但是,如果需要,您可以构建自己的扩展方法来处理它们。

于 2009-01-30T19:14:23.857 回答