Я смущен по поводу распоряжения. Я пытаюсь получить мой код, правильно распределяющий ресурсы. Поэтому я настраивал свои классы как 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) и затем возвращался.
Но у шрифта нет Dispose (bool) на нем (что я могу найти).
Подводя итог:
Зачем мне нужен Dispose (bool)? и если я делаю, почему у Font его нет? и поскольку у него его нет, почему FXCop просит меня его использовать?
Спасибо за все великолепные ответы. Я думаю, что теперь понимаю. Вот
Ответ, который я вижу:
Утилизация «неуправляемых» ресурсов делится на две категории:
- Ресурсы, которые обернуты в управляемый класс (например, Bitmap, Font и т. Д.), Но все еще нуждаются в вызове Dispose для их правильной очистки.
- Ресурсы, которые вы выделили, которые представляют собственные ресурсы (то есть контексты устройств, которые должны быть освобождены)
Dispose (bool) используется для определения разницы между ними:
- Когда Dispose напрямую вызывается для вашего объекта, вы хотите освободить оба вида «неуправляемых» ресурсов.
- Когда ваш объект готов к сборке мусора, вам не нужно беспокоиться о ресурсах первого типа. Сборщик мусора позаботится о них, когда очистит их. Вам нужно беспокоиться только об истинных собственных ресурсах, которые вы выделили (если есть).