如何在 C# 中实现 IDisposable 设计模式?
csharpserver side programmingprogramming更新于 2025/6/4 10:07:17
当需要处理非托管对象时,应该使用 IDisposable 设计模式(或 Dispose 模式)。
为了实现 IDisposable 设计模式,直接或间接处理非托管对象的类应该实现 IDisposable 接口,并实现 IDisposable 接口中声明的 Dispose 方法。我们不直接处理非托管对象,而是处理托管类,这些托管类直接处理非托管对象。例如,文件处理程序、连接字符串、HTTP 流等。
此模式的重要方面是,它使继承类更容易遵循 IDisposable 设计模式。这是因为它实现了可重写的 Dispose 方法。此模式还建议使用 Finalizer 方法(在 C# 中为析构函数)。但是,如果我们使用 Finalizer,则由于其性能影响,应对其进行适当的管理。
示例
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) { // Dispose managed objects httpClient.Dispose(); } // 处置非托管对象 disposed = true; } public void Get() { var response = httpClient.GetAsync(""); } public void Post(string request) { var response = httpClient.PostAsync("", new StringContent(request)); } }