[分享]另一种对 IDisposable 的实现
2013-01-04 20:05 Nana's Lich 阅读(327) 评论(1) 编辑 收藏 举报相比于刚发出来没多久的关于 MVVM 的文章,对 IDisposable 接口的讨论更是老生常谈了。
详细讲解 IDisposable 的文章也有很多,不想深入了解的看了会头晕,想深入了解的估计也早就了解过了。
所以本文不讲那么多大道理,实用为主,一切从简。
正文
实际上,不管和大家一起讨论过多少次,不管用过多少次,每次再使用 IDisposable 的时候总还是会有点犯迷糊,会怀疑自己实现得到底对不对。
久而久之,对 IDisposable 的实现就产生了一个模板,紧接着模板便理所当然地成了一个抽象类:
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。