我在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
更多的是尽快释放非托管资源。更伟大的思想可能会纠正我,但我很确定一旦您的应用程序卸载,操作系统无论如何都会释放非托管资源。