资源

资源清理 属于 C#

2 个练习

关于 资源清理

IDisposable 接口是资源清理的核心,在 C# 中有两个重要作用:

  • 它向实现该接口的类的使用者表明,他们有责任让类知道自己已不再被需要(通过调用 Dispose() 方法),从而让类可以释放任何非托管资源,或按需重置其内部状态。这与常规的清理方式形成对比:常规做法是让垃圾回收器清理一切(主要是释放内存)。
  • IDisposable 接口与编译器和运行时配合,支持 resource-lifetime练习中讨论的 using 语句。

在某些通用的清理例程中,也有可能通过接口调用 Dispose(),不过这种情况并不常见。

IDisposable 最常出现在包装操作系统(非托管)资源的库类中,例如 System.IO.Stream 和 System.IO.TextReader。(Stream 和 TextReader 在其他练习中会讲到。)

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

如果你使用的类实现了 IDispoable 接口,那么当实例不再被需要时,你必须确保调用 Dispose()(通过使用 catch 和 finally 子句)。如果一个类拥有实现了 IDisposable 的成员,那么它很可能也需要自己实现 IDisposable,这样才能调用 Dispose() 来释放实现了 IDisposble 的成员。

public class Activity : IDisposable
{
    private MyResource myResource;

    public Activity()
    {
        myResource = new MyResource();
    }

    public void Perform()
    {
        try
        {
            myResource.BeUseful();
        }
        catch (Exception)
        {
            myResource.Dispose();
        }
    }

    public void Dispose()
    {
        myResource.Dispose();
    }
}

即使不涉及非托管资源,IDisposable 接口也可能有用。假设你有一个长期存活的对象,它要求短期存活的对象向自己注册,并在不再被需要时注销。在短期存活的对象上实现 IDisposable,可以提醒使用该类的开发者:在短期存活对象生命结束时需要调用 Dispose()。

释放模式

你会在文档中看到对释放模式的引用。_释放模式_包括从类的终结器中调用 Dispose(),并确保正确释放基类中的资源。_释放模式_会在后面的练习中讲到。

_释放模式_主要与非托管资源有关。如果你使用 P/Invoke 机制和 extern 方法,那么你需要了解如何以及何时实现释放模式。大多数 C# 开发者很少需要以这种方式直接处理非托管资源。

通过 GitHub 编辑 该链接会在新窗口或标签页中打开

学习 资源清理

练习已锁定

再解锁 1 个练习即可练习 资源清理