gpt4 book ai didi

c# - 当类具有 IDisposable 成员但没有非托管资源时,我应该实现 IDisposable 吗?

转载 作者:可可西里 更新时间:2023-11-01 02:59:56 24 4
gpt4 key购买 nike

MSDN 文档和 StackOverflow 上的许多答案竭尽全力讨论如何正确实现 IDisposable,例如MSDN IDisposable , MSDN Implementing IDisposable , An excellent StackOverflow Q&A

然而,它们似乎都没有涵盖我所拥有的一个更常见的用例:当我的类有一个比一种方法生命周期更长的 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 的实例短暂存在的用例,所以说调用 Dispose 例如通过使用 using:

Implement IDisposable only if you are using unmanaged resources directly. If your app simply uses an object that implements IDisposable, don't provide an IDisposable implementation. Instead, you should call the object's IDisposable.Dispose implementation when you are finished using it.

当然,在我们需要实例比方法调用存活更长时间的地方,这是不可能的!?

我怀疑执行此操作的正确方法是实现 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 的事实让我犹豫不决......一个糟糕的程序员会做什么?

最佳答案

看起来您的案例确实包含在某些文档中,即设计警告 CA1001: Types that own disposable fields should be disposable .

该链接有一个示例,说明您的 IDisposable 实现应该是什么样子。它将如下所示。最终的设计指南可以在 CA1063: Implement IDisposable correctly 找到。 .

  class FantasticFileService : IDisposable
{
private FileSystemWatcher fileWatch; // FileSystemWatcher is IDisposable

public FantasticFileService(string watch)
{
fileWatch = new FileSystemWatcher(watch);
fileWatch.Changed += OnFileChanged;
}

~FantasticFileService()
{
Dispose(false);
}

protected virtual void Dispose(bool disposing)
{
if (disposing && fileWatch != null)
{
fileWatch.Dispose();
fileWatch = null;
}
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}

关于c# - 当类具有 IDisposable 成员但没有非托管资源时,我应该实现 IDisposable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37934420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com