AutoDisposer 工具类






3.81/5 (8投票s)
2007年3月15日
2分钟阅读

42730

109
在本文中,您将看到像 AutoDisposer 这样的简单类如何使编程更加容易。
引言
有很多类(在 .NET 框架或您自己的类中)实现了 IDisposable
接口,以便释放分配的非托管资源。当用户实例化此类时,必须在完成该类的实例后调用“Dispose”方法。遵循此模式很容易导致大量代码,因为此模式应与 try-finally 块(或 using 语句)一起使用。本文描述了 AutoDisposer
工具类,它可以减少很多代码,使您的代码更易于阅读。
背景
考虑以下代码(samplecode1)
private void ClaimResourcesOld()
{
ManualResetEvent resetEvent = new ManualResetEvent(true);
try
{
Brush drawingBrush = new SolidBrush(Color.FromArgb(50, Color.Purple));
try
{
.....
}
finally
{
drawingBrush.Dispose();
}
}
finally
{
((IDisposable)resetEvent).Dispose();
}
}
使用两个可释放对象会导致 try-finally 块的嵌套。请注意,也可以使用嵌套的 using 语句编写相同的代码,这已经减少了代码量,但仍然需要嵌套结构。有没有一种方法可以用相同的功能编写代码,而无需嵌套且代码更少?是的,有一个;使用一个名为 AutoDisposer
的小型工具类。
AutoDisposer 类
AutoDisposer
类是一个小型工具类,用于跟踪可释放对象列表。该类本身实现了 IDisposable
,并且在类的“Dispose”中,跟踪的元素将被释放。该类的接口是
public sealed class AutoDisposer : IDisposable
{
public AutoDisposer() : this(false) { }
public AutoDisposer(bool disposeReverse) { m_DisposeReverse =
disposeReverse; }
public void Add(object obj) { ... }
}
用户必须创建 AutoDisposer
类的一个实例,并通过“Add”方法添加可释放对象。在释放 AutoDisposer
类的实例时,所有跟踪的可释放对象都将按照添加的顺序释放。用户在使用 AutoDisposer
类的第二个重载构造函数时,也可以指定此顺序。
在互联网上搜索时,我找到了文章 Writing Better Software: Managing Unmanaged Resources,该文章也讨论了 AutoDisposer
类,该类具有基于堆栈的实现来跟踪可释放对象。本文的 AutoDisposer
类在以下问题上有所不同
- 可以添加所有类型的对象,而不仅仅是
IDisposable
类型的对象 - 可释放对象使用列表进行跟踪,用户可以指定释放跟踪对象的顺序
- 该类还处理可释放的空对象,用户在添加对象时不必检查可释放对象的有效性
使用代码
使用 AutoDisposer
类时,samplecode1 可以更改为以下代码(samplecode2)
private void ClaimResourcesNew()
{
using (AutoDisposer autoDisposer = new AutoDisposer())
{
ManualResetEvent resetEvent = new ManualResetEvent(true);
autoDisposer.Add(resetEvent);
Brush drawingBrush = new SolidBrush(Color.FromArgb(50, Color.Purple));
autoDisposer.Add(drawingBrush);
.....
}
}
如您所见,这大大减少了代码并使代码更易于阅读。
摘要
阅读本文应该让您意识到像 AutoDisposer
这样的一个小工具类可以使您的生活更轻松。如有任何意见或问题,请在下方发布或通过电子邮件发送。
历史
版本 1.0 - 这是本文的第一个版本。