代码之家  ›  专栏  ›  技术社区  ›  mbeckish

如果一个通用集合被实例化为包含iDisposable项目,这些项目会被丢弃吗?

  •  4
  • mbeckish  · 技术社区  · 17 年前

    例如:

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

    如果我没有显式地将每个项目从队列中取出并单独处理它们,那么在调用Clear()时是否会处理剩余的项目?队列何时被垃圾回收呢?

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

    编辑

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

    1. 当你从集合中删除一个项目时,确保你对其进行了Dispose()。
    2. 收集和处理每个 项目。

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

    4 回复  |  直到 17 年前
        1
  •  5
  •   Scott Dorman    17 年前

        2
  •  4
  •   On Freund    17 年前

    你预计什么时候处理它们?集合如何知道其中是否有对对象的其他引用?

        3
  •  2
  •   Igor Zelaya    17 年前

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

    编辑:

    以下代码实现了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
    }
    
        4
  •  0
  •   Joel Coehoorn    17 年前

    推荐文章