当我们需要处理非托管对象时,应该使用IDisposable设计模式(或“处理模式”)。
为了实现IDisposable设计模式,直接或间接处理非托管对象的类应实现IDisposable接口,并实现IDisposable接口内部声明的Dispose方法。我们不直接处理非托管对象。但是我们处理托管类,它直接处理非托管对象。例如,文件处理程序,连接字符串,HTTP流等。
此模式的重要方面在于,它使继承的类更容易遵循IDisposable设计模式。这是因为实现了可重写的Dispose方法。此模式还建议使用Finalizer方法(或c#中的析构函数)。但是,如果使用终结器,则由于其性能影响而应进行适当管理。
static class Program { static void Main(string[] args) { using var serviceProxy = new ServiceProxy(null); serviceProxy.Get(); serviceProxy.Post(""); Console.ReadLine(); } } public class ServiceProxy : System.IDisposable { private readonly HttpClient httpClient; private bool disposed; public ServiceProxy(IHttpClientFactory httpClientFactory) { httpClient = httpClientFactory.CreateClient(); } ~ServiceProxy() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposed) { return; } if (disposing) { //处置托管对象 httpClient.Dispose(); } //处置非托管对象 disposed = true; } public void Get() { var response = httpClient.GetAsync(""); } public void Post(string request) { var response = httpClient.PostAsync("", new StringContent(request)); } }