Полная очистка словаря многоадресных делегатов

У меня есть словарь делегатов многоадресной рассылки, где ключ - это определенный тип сообщения, а значения - делегаты многоадресной передачи, то есть обработчики сообщений.

Когда я хочу очистить этот словарь, я хочу убедиться, что все делегаты не связаны, не имеют разыменования и, в конечном счете, собирают мусор - достаточно ли очистить словарь или я должен перечислить значения (многоадресные делегаты) и установить их в null перед очисткой вниз по словарю?

3 ответа

Если у вас нет встречного примера (в этом случае вы должны открыть отчет об ошибках с MS), сборка мусора в.NET не должна быть проблемой. Он довольно сложный и может отследить объекты, на которые нет ссылок в коде, даже если они являются частью произвольно большого графа объектов, на который нет ссылок из рабочего образа.

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

Реальная проблема с.NET - не безопасность ссылок, а утечка ресурсов: любой класс IDisposable должен быть удален перед разыменованием. Тем не мение, MulticastDelegate это не одноразовый класс, так что это спорный вопрос.

Другими словами: это.NET, а не C. Стресс меньше. Не волнуйтесь.

Классы System.Delegate (и System.MulticastDelegate) обрабатываются так же, как и любые другие классы, они просто содержат указатели на функцию и целевой объект. Таким образом, со всеми намерениями и целями вы можете просто рассматривать это как ссылку на целевой объект.

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

Как только какой-либо объект становится недоступным, он становится пригодным для сбора мусора. Если вы не знакомы с механизмом сбора мусора, я настоятельно рекомендую вам немного ознакомиться с предметом.

Просто установите их на ноль.

foreach (var d in dict)
{
    d = null;
}

И когда компилятор больше не имеет ссылок на них, он собирает его для вас.

В конечном счете, просто сделайте все, чтобы продиктовать нуль

dict = null;

Сборка мусора в C# не должна быть проблемой.

Другие вопросы по тегам