当我们谈论GC和“堆”时,我们实际上是在谈论托管堆。托管堆上的对象可以访问不在托管堆上的资源,例如,在写入或读取文件时。当打开文件进行读取然后发生异常时,可能会发生意外行为,从而导致文件句柄无法正常关闭。因此,.NET要求非托管资源实现该IDisposable接口。该接口具有一个Dispose不带参数的单一方法:
public interface IDisposable
{
Dispose();
}处理非托管资源时,应确保正确处理它们。您可以通过显式调用执行此操作Dispose()在一个finally块,或者用一个using声明。
StreamReader sr;
string textFromFile;
string filename = "SomeFile.txt";
try
{
sr = new StreamReader(filename);
textFromFile = sr.ReadToEnd();
}
finally
{
if (sr != null) sr.Dispose();
}要么
string textFromFile;
string filename = "SomeFile.txt";
using (StreamReader sr = new Streamreader(filename))
{
textFromFile = sr.ReadToEnd();
}后者是首选方法,在编译过程中会自动扩展为前者。