Полная очистка словаря многоадресных делегатов
У меня есть словарь делегатов многоадресной рассылки, где ключ - это определенный тип сообщения, а значения - делегаты многоадресной передачи, то есть обработчики сообщений.
Когда я хочу очистить этот словарь, я хочу убедиться, что все делегаты не связаны, не имеют разыменования и, в конечном счете, собирают мусор - достаточно ли очистить словарь или я должен перечислить значения (многоадресные делегаты) и установить их в null перед очисткой вниз по словарю?
3 ответа
Если у вас нет встречного примера (в этом случае вы должны открыть отчет об ошибках с MS), сборка мусора в.NET не должна быть проблемой. Он довольно сложный и может отследить объекты, на которые нет ссылок в коде, даже если они являются частью произвольно большого графа объектов, на который нет ссылок из рабочего образа.
Тем не менее, нет никакой разницы между очисткой словаря и установкой всех его значений на ноль. Оба имеют одинаковый эффект простой разыменования базовых значений. Это излишне.
Реальная проблема с.NET - не безопасность ссылок, а утечка ресурсов: любой класс IDisposable должен быть удален перед разыменованием. Тем не мение, MulticastDelegate
это не одноразовый класс, так что это спорный вопрос.
Другими словами: это.NET, а не C. Стресс меньше. Не волнуйтесь.
Классы System.Delegate (и System.MulticastDelegate) обрабатываются так же, как и любые другие классы, они просто содержат указатели на функцию и целевой объект. Таким образом, со всеми намерениями и целями вы можете просто рассматривать это как ссылку на целевой объект.
Если вы закончили с ними, просто очистите словарь, если вы сделали с содержащим объектом, вам даже не нужно этого делать. Установка их на ноль по отдельности не будет делать ничего, что очистка словаря не будет делать.
Как только какой-либо объект становится недоступным, он становится пригодным для сбора мусора. Если вы не знакомы с механизмом сбора мусора, я настоятельно рекомендую вам немного ознакомиться с предметом.
Просто установите их на ноль.
foreach (var d in dict)
{
d = null;
}
И когда компилятор больше не имеет ссылок на них, он собирает его для вас.
В конечном счете, просто сделайте все, чтобы продиктовать нуль
dict = null;
Сборка мусора в C# не должна быть проблемой.