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

一般Penに、Brushオブジェクトの割り当ては、できるだけ遅く、できるだけDispose(..)速く行うことをお勧めします。通常、これは main (仮想)Paint(..)メソッド内で処理されます。これは、ほとんどすべてのフレームワーク (例外ではありません)の描画アーティファクトであり、高速な割り当て onと高速なdestroy.NETを保証するために、構造体のように宣言されています。stack

于 2012-08-15T18:43:40.897 に答える