如何自动处理列表中的对象?

How to automatically dispose objects inside List?

我有一个 class 需要处理的资源:

class Desert: IDisposable
{
    private object resource; // handle to a resource

    public Desert(string n)
    {
        // Create resource here
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (resource != null) resource.Dispose();
        }
    }
}

我想知道是否有任何方法可以自动要求框架在每个元素上调用 Dispose,只要 List 对象将被销毁,就像我有析构函数一样。目前我正在遍历列表并调用 Dispose:

// On form open
List<Desert> desertList = new List<Desert>();
for(int i = 0; i < 10; i++)
{
    desertList.Add(new Desert("Desert" + i));
}


// On form closing
for (int i = 0; i < 10; i++)
{
    desertList[i].Dispose();
}

这是在 List 中处理对象的唯一方法吗?

您可以扩展列表类型本身:

public class AutoDisposeList<T> : List<T>, IDisposable where T : IDisposable
{
    public void Dispose()
    {
        foreach (var obj in this)
        {
            obj.Dispose();
        }
    }
}

using (var myList = new AutoDisposeList<Desert>())
{

}

如果您需要的不止于此,您可以查看 Finalizers。这些不完全是析构函数 - 它们是 运行 就在对象被垃圾收集之前的方法。虽然这些很容易出错,但我投票赞成 using 语句。

参见:https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx