静态 ID是可置的字典模式



我在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;
    }
}

我看到以下问题:
在应用程序运行时从映射中删除对象不会释放它。您必须手动执行此操作。替换映射中的对象也是如此。

更新:
以下内容将保留未释放的对象:

_map[key] = new DisposableObject();

以前由 key 标识的对象将永远不会被释放。

关于整个概念:
这没有太大意义。.NET 运行时会在应用程序退出时释放应用程序的所有内存。因此,在与应用程序本身一样长的对象上实现IDisposable似乎是不需要的,除非它们包含对非托管资源的引用,例如打开的文件句柄。

除了其他人所说的之外,没有什么能阻止某人对字典中的一个对象调用Dispose - 因此您很容易混合使用已处置和未处置的对象。

当然,如果你正确地实现了IDisposable(即对象检查它是否已被释放),那么如果对象过早地被释放,它可能并不重要(但可能)重要......

我看不出这样做有多大意义,在应用程序结束时处理东西不会真正为你买到任何东西,因为你已经过了关心保留非托管资源的地步。 IDisposable更多的是尽快释放非托管资源。更伟大的思想可能会纠正我,但我很确定一旦您的应用程序卸载,操作系统无论如何都会释放非托管资源。

最新更新