我对图形对象的处理机制感到困惑。处理字体和钢笔等对象的最佳方式是什么?在实例化/处置它们时,最佳实践是什么?我的意思是作为类中的字段或方法中的变量?
例如,我有一个类似以下代码的类。我有一些字体和笔,在类中的任何地方都会用到,所以我不是每次都在调用方法的时候创建它们,我只是将它们创建为字段。这会提高性能吗?
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...
}
}发布于 2012-08-16 02:52:08
处理字体和钢笔等对象的最佳方式是什么?
最好也是唯一的方法是调用Dispose(),当您不再需要它们时,应该将它们处理掉。
以及实例化/处置它们时的最佳实践是什么?
这完全取决于您的实现。在大多数情况下,最好在使用完它们后立即创建并销毁它们。这完全取决于您的客户端代码如何实现PackageDrawer对象,以及可能访问这些对象的方法。
你可能想在StackOverflow上阅读关于IDisposable的文章。从您发布的内容中,您可以删除~PackageDrawer()终结器覆盖,只需创建一个Dispose()方法。您可能还希望将Dispose方法设为虚方法,以防从该方法派生任何类。
此外,没有任何东西阻止Dispose()在您的对象上被多次调用,所以您需要添加一个私有跟踪布尔值,以确保它不会多次尝试和Dispose()。此外,在尝试调用Dispose()之前,请始终对对象执行null检查,以避免出现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-16 02:43:41
在一般的Pen中,Brush对象的分配越晚越好,Dispose(..)越快越好。通常在main (假设的) Paint(..)方法中处理。这就是几乎所有框架( .NET也不例外)中的绘图工件都像结构一样声明,以保证在stack上的快速分配和快速销毁。
https://stackoverflow.com/questions/11975106
复制相似问题