65.9K
CodeProject 正在变化。 阅读更多。
Home

AutoDisposer 工具类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.81/5 (8投票s)

2007年3月15日

2分钟阅读

viewsIcon

42730

downloadIcon

109

在本文中,您将看到像 AutoDisposer 这样的简单类如何使编程更加容易。

Screenshot - AutoDisposer.gif

引言

有很多类(在 .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 - 这是本文的第一个版本。

© . All rights reserved.