如果泛型集合被实例化为包含iDisposable项目,那么这些项目是否被处置?

例如:

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

如果我没有明确列出每个项目并单独处理它们,那么在调用Clear()时是否会处理剩余的项目? 如何排队等待垃圾回收?

假设答案是“否”,那么最佳做法是什么? 你是否必须总是迭代队列并处理每个项目?

这可能会变得很难看,特别是如果你必须尝试......每次处理周围,以防万一抛出异常。

编辑

因此,对于泛型集合的用户来说,似乎负担知道如果这些项目是Disposable(意味着它们可能使用了不被垃圾收集器清理的非托管资源),那么:

  • 从集合中删除一个项目时,确保Dispose()它。
  • 请勿清除()。 迭代收集并处理每个项目。
  • 也许通用集合的文档应该提到这一点。


    你什么时候期望他们被处置? 该集合将如何知道是否有其他对象的引用?


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

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


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

    编辑:

    以下代码实现了一个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
    }
    
    链接地址: http://www.djcxy.com/p/54453.html

    上一篇: If a generic collection is instantiated to contain iDisposable items, do the items get disposed?

    下一篇: Bit fields in C#