Противоречие в шаблонном подходе Microsoft с GC? - PullRequest
0 голосов
/ 02 декабря 2011

Я знаю, что роль функции dispose заключается в очистке неуправляемых ресурсов.

но согласно шаблону Microsoft (что я понимаю) они делают это:

Они открыли новую централизованную функцию, которая принимает bool (isDispoisng);

если True, то есть от dispose func (используя using или что-то еще) - и он очищает неуправляемый и управляемый

если false, то оно получено от финализатора / деструктора. и он убивает только неуправляемых.

Я не понимаю, почему паттерн Microsoft убивает также managed, если isDispoisng==True (см. Слова, выделенные жирным шрифтом).

Я думал Финилизация должна убить всего неуправляемого ....

Не могли бы вы объяснить?

Чего они хотели достичь в этом?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2011

Поскольку ваши управляемые ресурсы могут удерживаться на других (неуправляемых) ресурсах, от которых может потребоваться удаление.

Поэтому любой объект, который реализует IDisposable, должен быть удален путем вызова его метода Dispose.

Редактировать: И действительно, необходимо также исключить подключения обработчиков событий, которые в противном случае не позволили бы объекту выходить из области видимости и собирать мусор.

0 голосов
/ 02 декабря 2011

В финализации участвуют затраты на производительность и задержку.В идеале, мы должны пытаться избежать вызова финализатора, следует избегать для любого конкретного случая.Это возможно, если вызывается метод Dispose, который очищает неуправляемые ресурсы.

Если вас интересует более четкое объяснение рекомендуемого шаблона расположения, чем то, что вы найдете в большинстве материалов MSDN, http://msdn.microsoft.com/en-us/magazine/cc163392.aspx - неплохое начало.

Кстати, реализация финализатора больше не является рекомендуемым подходом для очистки неуправляемых ресурсов, начиная с .NET 2.0.Вместо этого вы должны использовать SafeHandle , за исключением очень небольшого количества "специальных" сценариев .

...