MSDN文档和StackOverflow上的许多答案都详细讨论了正确实现 IDisposable
的方法,例如:MSDN IDisposable,MSDN Implementing IDisposable,一篇优秀的StackOverflow问答。
然而,它们似乎都没有涵盖我更常见的用例:当我的类有一个比一个方法生命周期更长的 IDisposable
成员时该怎么办?例如:
class FantasticFileService
{
private FileSystemWatcher fileWatch; // FileSystemWatcher is IDisposable
public FantasticFileService(string path)
{
fileWatch = new FileSystemWatcher(path);
fileWatch.Changed += OnFileChanged;
}
private void OnFileChanged(object sender, FileSystemEventArgs e)
{
// blah blah
}
}
最接近解决此问题的MSDN仅覆盖了IDisposable实例短暂存在的情况,因此建议使用using
调用Dispose方法:
仅在直接使用未托管资源时才实现IDisposable。如果您的应用程序仅使用实现IDisposable的对象,则不要提供IDisposable实现。相反,当您使用完该对象时,应调用其IDisposable.Dispose实现。
当需要实例的寿命长于方法调用时,这显然是不可能的!?
我怀疑正确的做法是实现IDisposable
(将责任传递给我的类的创建者来处理),但不需要所有终结器和protected virtual void Dispose(bool disposing)
逻辑,因为我没有任何未管理的资源,即:
class FantasticFileService : IDisposable
{
private FileSystemWatcher fileWatch; // FileSystemWatcher is IDisposable
public FantasticFileService(string watch)
{
fileWatch = new FileSystemWatcher(watch);
fileWatch.Changed += OnFileChanged;
}
public void Dispose()
{
fileWatch.Dispose();
}
}
但为什么官方文档中没有明确涵盖这种用例呢?并且它明确说明如果您的类没有非托管资源,则不要实现 IDisposable
,这让我犹豫不决...一个可怜的程序员该怎么办呢?
Dispose()
。你是不是忘记了GC.SuppressFinalize(this);
? - user585968sealed
(https://dev59.com/zW865IYBdhLWcg3wTcvg),否则仍需要使用完整的Dispose模式。 - Alexei Levenkov