【发布时间】:2018-11-20 10:11:02
【问题描述】:
给定以下课程:
public class MyDisposableContainer : IDisposable
{
readonly List<IDisposable> _chidlren = new List<IDisposable>();
public void Add() => _children.Add(new FileSystemWachter());
}
我不确定应该如何实现 Disposable 接口。
要么:
public void Dispose() => _children.ForEach(item => item.Dispose());
或
public void Dispose()
{
// Dispose of unmanaged resources.
Dispose(true);
// Suppress finalization.
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_children.ForEach(item => item.Dispose());
}
}
在我的例子中,孩子是使用一些非托管资源的 FileSystemWatcher,所以我猜它与终结器一起实现了一次性模式。
我想,第二种更长的方法是不必要的,因为它 Dispose(true) 只会在显式 Dispose() 调用时被调用。我说的对吗?
【问题讨论】:
-
你是对的,但请记住,如果你创建一个派生自
MyDisposableContainer的类,你的实现就会失败。你有两个选择让你的班级sealed或实现一个终结器和完整的Dispose模式。 -
啊,好吧,有道理。但是,是否有必要在基类中实现终结器(在我的情况下为 MyDisposableContainer)?不知何故,我不明白为什么当其他类继承自它时它是必要的
-
假设你需要一个终结器在 99.9% 的情况下都是错误的。它也在这里,FSW 已经有了自己的终结器。
-
基类中不需要终结器。考虑使用终结器仅用于当您需要某种保证以释放由于任何原因无法以其他方式释放的资源时(消费者未正确使用
Dispose,Dispose方法中引发的异常等) .由于 CLR 负责托管资源,因此受此类场景影响的唯一资源是非托管资源。 -
@DmytroMukalov:如果您在答案中总结了 cmets,您会很高兴
标签: c# dispose idisposable