代码改变世界

[分享]另一种对 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。