静态IDisposable字典模式

时间:2011-05-17 12:07:25

标签: c# design-patterns idisposable

我在Web应用程序中遇到如下情况。我只想检查它是一个好模式。可能发生的事情意味着我的字典是腐败的(有些成员被处置,有些成员没有,例如)?我是否正确实施了这个想法?

static IDictionary<string, IDisposable>() _map;

Application_Start()
{
    if (_map == null)
    {
         _map = new IDictionary<string, IDisposable>();
         _map.Add(...);
         _map.Add(...);
    }
}

Application_End
{
    if (_map != null)
    {
        foreach (var m in _map)
        {
            m.Value.Dispose();
        }
        _map = null;
    }
}

2 个答案:

答案 0 :(得分:5)

我看到以下问题:
在应用程序的运行时期间从地图中删除对象不会将其丢弃。您必须手动执行此操作。替换地图中的对象也是如此。

<强>更新
以下内容将留下未曝光的对象:

_map[key] = new DisposableObject();

以前由key识别的对象永远不会被处置。

关于整个概念:
它没有多大意义。 .NET运行时会在应用程序退出时释放所有内存。因此,只要应用程序本身似乎不需要,就可以在对象上实现IDisposable,除非它们持有对非托管资源(如打开文件句柄)的引用。

答案 1 :(得分:2)

除了其他人所说的内容之外,没有什么可以阻止某人在你的词典中的某个对象上调用Dispose - 所以你很容易混合处置和未处置的对象。

当然,如果你正确地实现IDisposable(即对象检查它是否被处置)那么它可能不会(但可能会)过早地处理对象......

我无法看到这样做是有意义的,处理事情因为应用程序结束并不会真正为你买任何东西,因为你已经过了关心持有非托管资源的问题。 IDisposable更多的是关于尽快释放非托管资源。更多的头脑可能会纠正我,但我很确定一旦你的应用程序被卸载,操作系统就会释​​放非托管资源。