C# 正确实现IDisposable 释放非托管资源
实现IDisposable 接口主要目的是为了释放非托管资源,如果没有非托管资源一般不必实现此接口。
实现了IDisposable的类都可以使用using来释放资源,会自动调用Dispose(),如果忘了using或显式调用Dispose(),那么析构函数就是兜底的了,否则没必要执行析构函数,析构函数执行情况比较复杂,性能不好。
public class MyClass : IDisposable
{
private readonly HttpClient _httpClient;
private volatile bool _disposed;
//实现了IDisposable的类都可以使用using来释放资源,会自动调用Dispose()。
public void Dispose()
{
Dispose(true);
//告知垃圾处理器,不必再调用此对象的析构方法: ~MyClass()
//如果不加这句,执行析构方法有复生的可能性,导致回收性能不好。
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(_disposed)
return;
if (disposing)
{
//释放一些继承了IDisposable 的托管资源。一般很少
}
//释放托管资源
_httpClient?.Dispose();
_disposed = true;
}
//析构函数,正常情况下调用了Dispose(),就不需要再执行析构函数。
~MyClass()
{
Dispose(false);
}
}