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

你可能感兴趣的:(c#,java,开发语言)