0

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

例如,我有一个类似以下代码的类。我有一些字体和笔在课堂上的任何地方都使用,所以不是每次在调用方法中创建它们,我只是将它们创建为字段。这会提高性能吗?

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...
   }
}
4

2 回答 2

2

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

最好也是唯一的方法是打电话给Dispose()您,当您不再需要它们时,您应该将它们处理掉。

实例化/处置它们时的最佳实践是什么?

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

您可能想IDisposable在 StackOverflow 上阅读这里的内容。从您发布的内容中,您可以删除~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;

}
于 2012-08-15T18:52:08.490 回答
1

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

于 2012-08-15T18:43:40.897 回答