статический IDisposable шаблон словаря - PullRequest
2 голосов
/ 17 мая 2011

У меня есть ситуация, как показано ниже в веб-приложении.Я просто хотел проверить, что это хороший шаблон.Может ли что-то произойти, что означало, что мой словарь был поврежден (некоторые участники были удалены, а некоторые нет, например)?Правильно ли я реализовал эту идею?

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 ]

5 голосов
/ 17 мая 2011

вижу следующую проблему:
Удаление объекта с карты во время выполнения приложения не приводит к его удалению. Вам придется сделать это вручную. То же самое относится и к замене объекта на карте.

UPDATE:
Следующее оставит неиспользованные объекты вокруг:

_map[key] = new DisposableObject();

Объект, который был ранее идентифицирован key, никогда не будет уничтожен.

Об общей концепции:
Это не имеет особого смысла. Среда выполнения .NET освобождает всю память вашего приложения при выходе. Таким образом, реализация IDisposable для объектов, которые живут до тех пор, пока само приложение кажется ненужным, если только они не содержат ссылок на неуправляемые ресурсы, такие как дескриптор открытого файла.

2 голосов
/ 17 мая 2011

В дополнение к тому, что сказали другие люди, ничто не мешает кому-то звонить Dispose на один из объектов в вашем словаре - так что вам будет довольно легко иметь смесь расположенных и не расположенных объектов.

Конечно, если вы правильно реализуете IDisposable (т.е. объект проверяет, был ли он удален), тогда это может не иметь значения (но, вероятно, будет), если объекты удаляются преждевременно ...

Я могуЯ не вижу смысла делать это, поскольку утилизация по окончании работы приложения ничего вам не даст, поскольку вы перешли к тому, чтобы заботиться о неуправляемых ресурсах.IDisposable больше о высвобождении неуправляемых ресурсов как можно скорее.Меня могут поправить другие мысли, но я уверен, что после того, как ваше приложение выгружено, ОС все равно освобождает неуправляемые ресурсы.

...