如何在C#中实现IDisposable设计模式?
当我们需要处理非托管对象时,应该使用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));
}
}