Вопрос

Необходимо ли вручную управлять временем жизни объектов System.Drawing?

В настоящее время я использую операторы «using», чтобы минимизировать срок службы кистей и других объектов рисования, например.

using ( Brush br = new SolidBrush( color ) )
{
    // Do something with br
}

Необходимо ли это или безопасно позволить сборщику мусора творить чудеса, когда и если это необходимо?

Вкратце к вопросу...что люди думают, что это самый чистый способ добиться этого?

Это было полезно?

Решение

хорошо избавляться от объекта System.Drawing, однако если вы пропустите один или два при получении исключения и т. д., это не конец света. (Другие объекты, такие как открытые файлы и соединения с базой данных должны всегда быть расположены)

Наличие большого количества & # 8220; использования & # 8221; утверждение по всему вашему коду делает его более сложным для понимания. Поэтому в случае объекта System.Drawing я бы решил просто вызвать Dispose () для них в конце метода.

В прошлом я использовал написанный мной класс & # 8220; Dustcart & # 8221 ;, который реализует IDisposable и содержит коллекцию объектов для удаления. Затем вы можете написать код как

using(var dustcart = new Dustcard())
{
   var p = dustcart.Add(new Pen(red, etc));
   var b = dustcart.Add(new Brush(black));

   Pen t;
   if (someFlag)
   {
      t = p;
   }
   else
   {
      t = dustcard.Add(new Pen(etc));
   }
}

Другие советы

Когда объект является IDisposable, тогда лучше утилизировать его, как только он вам больше не нужен. (Он реализует IDisposable по причине).

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

Итак, мой совет: вызывайте Dispose вручную (как вы это делаете сейчас), как только вам больше не нужен одноразовый объект.

Общее правило заключается в том, что если объект реализует IDisposable, его необходимо очистить. IDisposable не реализован по прихоти в .NET Framework - есть веские причины для этого.

Как сказали другие:Когда вы создаете объект IDisposable, вам следует удалить его как можно скорее.В вашем конкретном примере, если цвет известен во время компиляции, вы можете использовать стандартную кисть, например Brush br = Brushes.Blue, которую вам не нужно удалять.

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

Я использую выражение «использование» так же, как вы описали в своем вопросе, чтобы гарантировать, что кисть, перо, шрифт, любой ресурс утилизируется должным образом. В моем коде я считаю использование операторов более чистым, чем разбросанные по всему явные вызовы .Dispose (). Но это только мои предпочтения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top