如果您想确定地处置集合中的对象,您应该调用Dispose
每个:
myImages.ToList().ForEach(image => image.Dispose());
如果你不这样做,并且如果你的对象变得不可访问,GC 最终将运行并释放它们。
现在,如果您不想手动编写Dispose
调用代码,您可以创建一个包装类来实现IDisposable
并通过using
语句使用它:
using (myImages.AsDisposable()) {
// ... process the images
}
这是所需的“基础设施”:
public class DisposableCollectionWrapper<D> : IDisposable
where D : IDisposable {
private readonly IEnumerable<D> _disposables;
public DisposableCollectionWrapper(IEnumerable<D> disposables) {
_disposables = disposables;
}
public void Dispose() {
if (_disposables == null) return;
foreach (var disposable in _disposables) {
disposable.Dispose();
}
}
}
public static class CollectionExtensions {
public static IDisposable AsDisposable<D>(this IEnumerable<D> self)
where D : IDisposable {
return new DisposableCollectionWrapper<D>(self);
}
}
另请注意,这与您使用 C++ 描述的情况不同。在 C++ 中,如果你没有delete
你的对象,你就会有真正的内存泄漏。在 C# 中,如果您不处置对象,垃圾收集器最终会运行并清理它。