我对处理图形对象的机械结构很困惑。处理字体和笔等对象的最佳方法是什么?什么是实例化/处置它们时的最佳实践?我的意思是作为类中的字段或方法中的变量?
例如,我有一个类如下代码。我有一些字体和笔在类中使用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...
}
}
答案 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)
一般来说,Pen
,Brush
对象最好尽可能晚地分配,Dispose(..)
尽可能快。通常在main(假设)Paint(..)
方法中处理。这是几乎所有框架中的绘图工件(并且.NET
不是例外)被声明为结构,以保证stack
上的快速分配和快速销毁。