代码改变世界

实现IDisposable以实现更优雅的代码

2010-10-30 21:08 囧月 阅读(...) 评论(...) 编辑 收藏

    从msdn知道,using语句是用来调用对象的Dispose方法:

按照规则,当使用 IDisposable 对象时,应在 using 语句中声明和实例化此对象。using 语句按照正确的方式调用对象上的 Dispose 方法,并(在您按照前面所示方式使用它时)会导致在调用 Dispose 时对象自身处于范围之外。在 using 块中,对象是只读的并且无法进行修改或重新分配。

 

    刚好碰到这样一种情况:

	ReaderWriterLock locker = new ReaderWriterLock();
	try {
		locker.AcquireWriterLock(0);
		//do xxx
	} finally {
		locker.ReleaseWriterLock();
	}

 

    通过实现IDisposable接口的Wrapper:

	class WriterLockWrapper : IDisposable
	{
		private ReaderWriterLock locker;
		
		public WriterLockWrapper(ReaderWriterLock locker)
		{
			this.locker = locker;
		}
		
		public void Enter()
		{
			this.locker.AcquireWriterLock(0);
		}
		
		void IDisposable.Dispose()
		{		
			this.locker.ReleaseWriterLock();
		}
	}

 

    然后代码就变成:

	ReaderWriterLock locker = new ReaderWriterLock();
	using (WriterLockWrapper wrapper = new WriterLockWrapper(locker))
	{
		wrapper.Enter();
		//do xxx
	}

 

    看起来是不是优雅多了呢。当需要更多处理的时候,只需要对wrapper进行更改,而不需要对调用代码进行任何更改,灵活性也比较好。

 

    注:本文与IDisposable释放资源无关。