2012-08-15 47 views
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... 
    } 
} 
+0

您不需要终结器,也不应该用它来调用Dispose,因为不能保证这些字段还没有完成。 – Lee 2012-08-15 18:45:38

+0

@李你能再解释一下吗? “领域还没有最终确定”是什么意思? – 2012-08-15 18:50:24

+0

无法保证终结器执行的顺序,所以到'PackageDrawer'的终结器运行时,其字段的终结器可能已经执行完毕。在Finaliser中没有什么可以做的,所以你应该删除它。 – Lee 2012-08-15 18:53:04

回答

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

一般PenBrush对象的是更好地迟快,因为它可以分配,因为它可能和Dispose(..)。通常在主要(假设)Paint(..)方法内处理。这就是几乎中的绘图工件都被声明为结构体,以保证在stack上的快速分配和快速的销毁的所有框架(并且.NET也不例外)。

+0

'Brush'是一个引用类型,而不是一个值类型。 – sisve 2012-08-15 18:49:45

+0

我在.NET中实现'IDisposable'的唯一图形相关类型是类类型。实际上,由于实现了一些继承该接口的其他接口(通常为IEnumerator ),我唯一能够想到实现“IDispose”的'struct'类型是这样做的;他们都没有做任何事情来响应'IDisposable.Dispose'。 – supercat 2012-08-15 18:50:19

+0

@supercat:事实上,我没有在我关于一次性“结构”的答案中发言,我写*破坏*(以某种方式)。 – Tigran 2012-08-15 18:57:56