首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理Graphics对象

处理Graphics对象
EN

Stack Overflow用户
提问于 2012-08-16 02:38:39
回答 2查看 1.4K关注 0票数 0

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

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

代码语言:javascript
复制
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...
   }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-16 02:52:08

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

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

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

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

你可能想在StackOverflow上阅读关于IDisposable的文章。从您发布的内容中,您可以删除~PackageDrawer()终结器覆盖,只需创建一个Dispose()方法。您可能还希望将Dispose方法设为虚方法,以防从该方法派生任何类。

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

代码语言:javascript
复制
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;

}
票数 2
EN

Stack Overflow用户

发布于 2012-08-16 02:43:41

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11975106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档