Предотвращение расположения определенной системой Pen и экземпляров Кисти

Я понимаю, что это - наиболее успешная практика для вызова, Располагают () на экземплярах Pen и Кисти, кроме того, если они были установлены на предопределенные системой значения (например, Система. Рисунок. Кисти, Система. Рисование. Перья или Система. Рисование. SystemBrushes)

Попытка расположить определенный системой ресурс приводит к выданному исключению.

Это, кажется, не очевидно, как можно обнаружить (кроме обертывания Расположения () вызов в попытке/выгоде), ссылается ли один из этих ресурсов на определенное системой или пользовательское значение.

11
задан mafu 30 September 2010 в 10:10
поделиться

5 ответов

Нет необходимости вызывать Dispose . Целью сборки мусора является устранение требований такого рода.

Одна из основных целей IDisposable - разрешить классу очищать неуправляемые ресурсы в средах с ограниченными ресурсами. Если вы не вызовете метод dispose, неуправляемые ресурсы класса будут очищены после завершения и удаления объекта во время сборки мусора.

Если вы «должны» вызвать dispose и не знаете, является ли экземпляр кисти «системной» или «нормальной» кистью, тогда вам придется использовать блок try ... catch.

  • Нет необходимости вызывать dispose для SystemBrushes и SystemPens , потому что об этих ресурсах позаботится библиотека GDI +.
  • Можно удалить SystemFonts и SystemIcons .

В разделе Remarks класса будет указано, требуется ли вызывать метод Dispose . Если в разделе «Замечания» рекомендуется вызывать метод Dispose, то я это сделаю.

В общем, я не призываю утилизировать ручки и кисти. Если у меня есть приложение или класс с интенсивной графикой, я буду кэшировать экземпляры необходимых мне ручек и кистей. Я использую их на протяжении всего жизненного цикла приложения или класса.Если я этого не сделаю, производительность рисования графики пострадает от попыток создавать и удалять все эти объекты так много раз и так часто. (Хм ... теперь, когда я думаю об этом, производительность, вероятно, является причиной того, что мы не можем избавиться от SystemBrushes и SystemPens, но можем избавиться от SystemFonts и SystemIcons. Даже фреймворк кеширует SystemBrushes и SystemPens.)

-9
ответ дан 3 December 2019 в 02:52
поделиться

Я могу ошибаться, но думаю, вы можете предположить, что время жизни (и утилизация) предопределенных кистей и перьев не входит в обязанности вашего приложения и будет обрабатываться системой.

Короче говоря: не вызывайте Dispose на предопределенных вещах. :)

.
0
ответ дан 3 December 2019 в 02:52
поделиться

Единственное, что нужно иметь в виду, - это выработать практику не использовать Системные ручки / кисти в качестве параметров методов.

0
ответ дан 3 December 2019 в 02:52
поделиться

Прежде всего, вы всегда должны утилизировать кисти, когда это возможно, и не оставлять это на усмотрение сборщика мусора. Хотя GDI в конечном итоге позаботится об этом (при условии, что библиотека отключится должным образом), неизвестно, когда это может произойти. На самом деле, насколько я понимаю, ручки для кистей остаются надолго. В ходе длительного приложения вы сталкиваетесь с утечкой памяти де-факто . Конечно, в небольшом приложении, которое не будет работать долго, или в приложении, которое редко создает кисти, вы можете позволить системе справиться с этим, но это мне кажется небрежным.

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

2
ответ дан 3 December 2019 в 02:52
поделиться

Для полноты картины, используя Reflector, я вижу, что классы System.Drawing.Pen и System.Drawing.SolidBrush имеют частное поле с именем «immutable».

Кажется, что для этого поля установлено значение true, когда объект ссылается на системный ресурс, поэтому вы можете использовать отражение, чтобы тщательно проверить значение этого поля, чтобы решить, следует ли вызывать для него Dispose ().

0
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: