实现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);
- }
- }