处理System.Drawing对象

时间:2009-09-10 07:26:11

标签: c# garbage-collection drawing

是否有必要手动管理System.Drawing对象的生命周期?

目前我正在使用'using'语句来最小化Brushes和其他Drawing对象的生命周期,例如

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

这是必要的还是让垃圾收集器在需要的时候发挥作用是否安全?

快速解决问题......人们认为最简单的方法是什么?

6 个答案:

答案 0 :(得分:10)

当一个对象是IDisposable时,最好在你不再需要它时立即处理它。 (它出于某种原因实现了IDisposable。)

当然,当你忘记调用Dispose时,垃圾收集器会在一段时间内完成它的工作并清理它,以便释放资源,但你永远不能告诉或猜测垃圾收集器什么时候启动,它不确定。

所以,我的建议是:一旦你不再需要一次性物品,就手动调用Dispose(就像你现在正在做的那样)。

答案 1 :(得分:2)

一般的经验法则是,如果一个对象实现了IDisposable,你需要清理它。 IDisposable并没有在.NET Framework中随心所欲地实现 - 它有很好的理由存在。

答案 2 :(得分:2)

对于System.Drawing对象的Dispose来说是,但是如果你在得到异常等时错过了一两个,那么它就不是世界末日。 (其他对象如打开的文件和数据库连接必须始终处置)

在您的代码中包含大量“使用”语句会使理解起来更加复杂。因此,在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));
   }
}

答案 3 :(得分:1)

正如其他人所说:当你创建一个IDisposable对象时,你应该尽快处理它。在您的具体示例中,如果在编译时已知颜色,则可以使用标准画笔,例如Br​​ush br = Brushes.Blue,您无需处置。

答案 4 :(得分:1)

如果你反复重复使用相同的颜色,你可以将画笔存储为类级别的成员,但是这意味着拥有类也应该是IDisposable,并将画笔成员放在它的dispose方法中。 这会增加内存存储量(按一个画笔的大小),但可能会减少代码量(不使用语句而是额外的Dispose覆盖)。

答案 5 :(得分:0)

我正在使用你在问题中描述的'using'语句来保证Brush,Pen,Font,无论什么资源都被正确处理掉。在我的代码中,我发现using语句比分散的显式.Dispose()调用更干净。但这只是我的偏好。

我同意上面的答案:无论您是喜欢使用语句还是.Dispose调用,手动清理资源非常重要,而不是依赖于垃圾收集器。 (我最初依赖于垃圾收集器,性能问题开始出现,甚至在应用程序中的内容变得复杂之前。)