Утилизация объектов System.Drawing - PullRequest
       27

Утилизация объектов System.Drawing

1 голос
/ 10 сентября 2009

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

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

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

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

Если коротко ответить на вопрос ... что люди считают самым чистым способом добиться этого?

Ответы [ 6 ]

10 голосов
/ 10 сентября 2009

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

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

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

2 голосов
/ 23 сентября 2009

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

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

В прошлом я использовал класс, который я написал, «Dustcart», который реализует 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));
   }
}
2 голосов
/ 10 сентября 2009

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

1 голос
/ 10 сентября 2009

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

1 голос
/ 10 сентября 2009

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

0 голосов
/ 23 сентября 2009

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

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

...