处置图形对象

时间:2012-08-15 18:38:39

标签: c# winforms graphics dispose idisposable

我对处理图形对象的机械结构很困惑。处理字体和笔等对象的最佳方法是什么?什么是实例化/处置它们时的最佳实践?我的意思是作为类中的字段或方法中的变量?

例如,我有一个类如下代码。我有一些字体和笔在类中使用eveywhere,所以不是每次在调用方法中创建它我只是将它们创建为字段。这会改善性能吗?

public class PackageDrawer : IDisposable
{
   Font font1 = ....
   Font font2 = ....
   Font font3 = ....
   Pen  pen1 = ...
   Pen  pen2 = ...
   Pen  pen3 = ...

   public Bitmap Draw()
   {
       //use fonts and pens here
       //also they are being user in more methods
   }

   ~PackageDrawer()
   {
       Dispose();
   }

   public void Dispose()
   {
       font1.Dispose();
       //And dispose other stuff...
   }
}

2 个答案:

答案 0 :(得分:2)

  

处理字体和笔等对象的最佳方法是什么?

最好也是唯一的方法是致电Dispose()当您不再需要时,应该将它们丢弃。

  

实例化/处理它们时最好的做法是什么?

这一切都取决于您的实施。在大多数情况下,最好在完成后立即创建并销毁它们。这完全取决于您的客户端代码如何实现PackageDrawer对象以及可能访问这些对象的方法。

您可能希望在StackOverflow上阅读IDisposable。根据您发布的内容,您可以删除~PackageDrawer()终结器覆盖,只需制作Dispose()方法即可。您可能还希望将Dispose方法设为虚拟,以防您从此方法派生任何类。

此外,在您的对象上多次调用Dispose()没有任何阻止,因此您需要添加私有跟踪布尔值,以确保它不会尝试Dispose()不止一次。此外,在尝试调用Dispose()以避免NullReferenceException之前,请始终对对象进行空检查。

private bool _isDisposed;

public void Dispose()
{
    Dispose(true);
}

protected virtual void Dispose(bool disposing)
{
   if (_isDisposed)
      return;

   if (disposing)
   {
       if (font != null)
           font.Dispose();
   }

   _isDisposed = true;

}

答案 1 :(得分:1)

一般来说,PenBrush对象最好尽可能晚地分配,Dispose(..)尽可能快。通常在main(假设)Paint(..)方法中处理。这是几乎所有框架中的绘图工件(并且.NET不是例外)被声明为结构,以保证stack上的快速分配和快速销毁