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# 开发者很少需要以这种方式直接处理非托管资源。