C# IDispose使用实例
using System; using System.ComponentModel; //下面的例子演示了如何创建 //实现IDisposable接口的资源类 //和IDisposable。处理方法。 public class DisposeExample { //实现IDisposable的基类。 //通过实现IDisposable,你宣布 //这种类型的实例分配稀缺资源。 public class MyResource: IDisposable { // 指向外部非托管资源的指针。 private IntPtr handle; // 该类使用的其他托管资源。 private Component component = new Component(); // 跟踪是否调用了Dispose。 private bool disposed = false; //类的构造函数。 public MyResource(IntPtr handle) { this.handle = handle; } //实现IDisposable。 //不要将此方法设为虚方法。 //派生类不能重写此方法。 public void Dispose() { Dispose(disposing: true); //该对象将被Dispose方法清除。 //因此,应该调用GC。SuppressFinalize来将此对象从终结队列中移除 //并阻止此对象的终结代码从执行第二次。 GC.SuppressFinalize(this); } //在两个不同的场景中执行Dispose(bool Dispose)。 //如果dispose = true,则直接调用了该方法 //或间接地由用户的代码。受管资源和非受管资源 //可以处理。 //如果dispose = false,则该方法已被 //终止器内部的运行时,你不应该引用 //其他对象。只能处置非托管资源。 protected virtual void Dispose(bool disposing) { //检查是否已经调用了Dispose。 if(!this.disposed) { //如果处置等于true,处置所有已管理的非托管资源。 if(disposing) { // 处置托管资源。 component.Dispose(); } //调用适当的方法进行清理 //这里的非托管资源。 //如果处置为false, //只执行以下代码。 CloseHandle(handle); handle = IntPtr.Zero; //处理完成。 disposed = true; } } //使用interop调用必要的方法清理非托管资源。 [System.Runtime.InteropServices.DllImport("Kernel32")] private extern static Boolean CloseHandle(IntPtr handle); //使用c#终结器语法来终结代码。 //只有当Dispose方法被调用时,这个终结器才会运行 //不被调用。 //它给基类一个完成的机会。 //不要在该类派生的类型中提供终结器。 ~MyResource() { //不要在这里重新创建Dispose清理代码。 //调用Dispose(Dispose: false)是最优的 //可读性和可维护性。 Dispose(disposing: false); } } public static void Main() { //在这里插入代码创建 //并使用MyResource对象。 } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章