如果一般收藏的实例包含iDisposable项目,执行的项目得到安置?
-
20-08-2019 - |
题
例如:
Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();
如果我不明确队的每个项目和处置他们的独立,执行其余的项目得到安置的时候叫明()?怎么样时,队列中的是垃圾收集的?
假设回答是"不是",那么什么是最好的做法吗?你一直迭代队和处理每个项目?
这可以获得丑陋的,尤其是如果你要尝试。。最后周围每一处理,情况下,一个抛出一个例外。
编辑
因此,这似乎是负担是在用户一般收集知道,如果项目都是一次性的(这意味着他们可能使用不受管理的资源不会被清理的垃圾收集器),则:
- 当你删除一个项目从集合,确保你处置()。
- 不要叫明().迭代过 收集和处理的每一个 的项目。
或许该文件的通用集应当提及。
解决方案
当你希望他们设置?如何将所收集知道,如果有其他参考资料中的对象吗?
其他提示
一般收藏品实际上并不知道任何有关种类型的对象,它们包含的,因此呼吁明确将不会导致他们呼Dispose()上的项目。GC将最终处置它们一旦收集本身得到设置的,提供了没有别的有一个活跃的参考之一,这些项目。
如果你想要确保对象具有自己的处理方法被称为当你打电话清楚的集会需要得出自己的收集和复盖适当的方法和作出的呼吁自己。
让我看看如果我可以写一个例子码为这一个。
编辑:
以下代码实现一个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
}
正如其他人所说的那样,它不会发生。然而,可以建立自己的延伸方法来处置他们,如果你想要的。
不隶属于 StackOverflow