Я смущен насчет распоряжаться. Я пытаюсь правильно использовать ресурсы для моего кода. Поэтому я настраивал свои классы как IDisposable (с помощью метода Dispose), чтобы убедиться, что метод Dispose вызывается.
Но теперь FXCop сообщает мне много информации об Disposing = false и вызове Dispose (false).
Я не вижу метод Dispose, который принимает bool. Нужно ли мне это сделать? Если да, то почему? Почему бы просто не вызвать метод, вызываемый при его утилизации?
Я видел здесь код: http://msdn.microsoft.com/en-us/library/ms244737.aspx, который показывает, как сделать метод Disposing, который принимает bool. В нем говорится, что это для локальных управляемых ресурсов. Но я думал, что весь смысл распоряжения - только для неуправляемых ресурсов.
Кроме того, строка, которую FXCop жалуется, такова:
~OwnerDrawnPanel()
{
_font.Dispose();
}
В нем говорится:
CA1063: Microsoft.Design: измените 'OwnerDrawnPanel. ~ OwnerDrawnPanel()', чтобы он вызывал Dispose (false), а затем возвращался.
Но у Font нет Dispose (bool) на нем (что я могу найти).
Подводя итог:
Зачем мне нужен Dispose (bool)? и если да, то почему у Шрифта нет? и поскольку у него его нет, почему FXCop просит меня использовать его?
Спасибо за все замечательные ответы. Думаю, теперь я понимаю. Здесь
Ответ, как я вижу:
Устранение "неуправляемых" ресурсов относится к двум категориям:
- Ресурсы, которые обернуты в управляемый класс (например, Bitmap, Font и т.д.), но все равно нужно Dispose вызывать для их правильной очистки.
- Ресурсы, которые вы выделили, которые представляют собой собственные ресурсы (то есть контексты устройства, которые должны быть выпущены)
Dispose (bool) используется для определения разницы между двумя:
- Когда Dispose непосредственно вызывается на ваш объект, вы хотите освободить оба вида "неуправляемых" ресурсов.
- Когда ваш объект подходит для коллекции мусора, вам не нужно беспокоиться о первом виде ресурсов. Сборщик мусора позаботится о них, когда он очистит их. Вам нужно только беспокоиться о реальных ресурсах, которые вы выделили (если они есть).