c# - 如何自动释放List中的对象?

标签 c# dispose

我有一个包含需要处置的资源的类:

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>())
{

}

如果您需要更多,您可以查看终结器。这些并不完全是析构函数 - 它们是在对象被垃圾收集之前运行的方法。不过,这些很容易出错,我投票支持 using 语句。

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

关于c# - 如何自动释放List中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46101315/

相关文章:

c# - INSERT 语句与 FOREIGN KEY 约束错误冲突

c# - 在 C# 中计算 Switch 语句中的表达式

c# - 如何仅在应用程序打开并运行时在后台运行方法?

c# - 函数中的 Dispose 方法重要吗?

c# - 使用 foreach 循环删除 Winform 上的所有控件

c# - 创建一个覆盖层以禁用所有其他表单元素

c# - ChangeTracker.Entries() CurrentValue 等于 EF7 中的 OriginalValue

linq-to-sql - 当暴露 IQueryable 时,DataContext 何时被处置?

java - 如何在处理时添加 Action 监听器

c# - 我可以一次性处理多个对象吗?