[分享]另一种对 IDisposable 的实现
2013-01-04 20:05 Nana's Lich 阅读(327) 评论(1) 编辑 收藏 举报相比于刚发出来没多久的关于 MVVM 的文章,对 IDisposable 接口的讨论更是老生常谈了。
详细讲解 IDisposable 的文章也有很多,不想深入了解的看了会头晕,想深入了解的估计也早就了解过了。
所以本文不讲那么多大道理,实用为主,一切从简。
正文
实际上,不管和大家一起讨论过多少次,不管用过多少次,每次再使用 IDisposable 的时候总还是会有点犯迷糊,会怀疑自己实现得到底对不对。
久而久之,对 IDisposable 的实现就产生了一个模板,紧接着模板便理所当然地成了一个抽象类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public abstract class DisposableObject : IDisposable { protected DisposableObject() { IsDisposed = false ; } public bool IsDisposed { get ; private set ; } protected abstract void Dispose( bool disposing); public void Dispose() { if (IsDisposed) return ; Dispose( true ); IsDisposed = true ; GC.SuppressFinalize( this ); } ~DisposableObject() { Dispose( false ); } } |
实现 IDisposable 的时候只要派生自这个抽象类再覆盖 void Dispose(bool disposing) 这个方法就好了。
需要注意的地方则是:
1、只有当 disposing 的值为 true 时需要改变向外暴露的状态信息,通常来说都是值类型的属性,而当 disposing 为 false 的时候不需要这么做;
2、在 Dispose 方法中只需要释放那些未被封装成托管对象的资源,例如通过 IntPtr 操作的系统对象,而实现了 IDisposable 的对象则不需要在此处进行释放,因为它们同样也实现了 Finalizer。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2011-01-04 Web Deploy 高级应用:自动设置 ACL