如果泛型集合被实例化为包含iDisposable项目,那么这些项目是否被处置?
例如:
Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();
如果我没有明确列出每个项目并单独处理它们,那么在调用Clear()时是否会处理剩余的项目? 如何排队等待垃圾回收?
假设答案是“否”,那么最佳做法是什么? 你是否必须总是迭代队列并处理每个项目?
这可能会变得很难看,特别是如果你必须尝试......每次处理周围,以防万一抛出异常。
编辑
因此,对于泛型集合的用户来说,似乎负担知道如果这些项目是Disposable(意味着它们可能使用了不被垃圾收集器清理的非托管资源),那么:
也许通用集合的文档应该提到这一点。
你什么时候期望他们被处置? 该集合将如何知道是否有其他对象的引用?
泛型集合实际上并不知道它们包含的对象的类型,因此调用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#