gpt4 book ai didi

c# - 当所有成员都被显式处置时,类是否需要实现 IDisposable?

转载 作者:行者123 更新时间:2023-11-30 19:29:50 25 4
gpt4 key购买 nike

试图了解何时需要实现 IDisposable:

我写了一个小例子。

  public class FileManager
{
private FileStream fileStream;
public void OpenFile(string path)
{
this.fileStream = File.Open(path, FileMode.Open, FileAccess.Read);
}
public void CloseFile(string path)
{
if ( this.fileStream != null && this.fileStream.CanRead)
{
this.fileStream.Close();
}
this.fileStream.Dispose();
}
}

// client
var manager = new FileManager();
manager.Open("path");
manager.Close("path");

这个类是否需要实现 IDisposable,因为它有一个托管资源 (FileStream),它持有一个非托管资源(一个文件)?还是我不必实现 IDisposable 因为我在类里面进行清理?

困惑。

最佳答案

对于实现IDisposable 并且可能以非平凡的方式实现的任何类型的每个实例,它必须随时都可以识别该实例将如何Disposed。在大多数情况下,这意味着每个 IDisposable 实例都有一个明确定义的所有者,负责调用 Dispose。对于类创建的 FileStream 实例,您的类是所有者,因为没有其他任何东西能够Dispose 它。

具有引用 IDisposable 实例的字段的类 它们拥有 应该几乎总是实现 IDisposable,并使用它们的 Dispose 方法来 Dispose 他们拥有的 IDisposable 对象。你们类有这样一个领域;因此它应该实现 IDisposable

只要有可能,就应该设计一个需要清理的类,以便对其调用 IDisposable.Dispose 就足以执行可能需要的任何和所有此类清理。在某些情况下,不使用其他方法执行清理可能是不切实际的,但这种情况非常罕见。如果可以设计一个类以便 Dispose 负责所有必要的清理工作,那么就应该这样做。

关于c# - 当所有成员都被显式处置时,类是否需要实现 IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956140/

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