3

私は現在、かなりの量の描画コードを含む、ユーザーコントロール用のかなり複雑なペイントメソッドを書いています。すべてのGDI+リソースを適切に廃棄する必要があることを知っているので、それぞれを1つのusingブロックにまとめます。

しかし、3つのusingブロックを3つの異なるものに使用していることに気付いたとき、SolidBrushesそれらを再利用するだけではいけないのではないかと思いました。を作成しSolidBrush、それを使って描画し、別の色を割り当て、他の何かを描画するなどDispose()。最後にを配置します。

そのようなことはお勧めですか、それとも私はここであまりにも一生懸命考えていますか?usingお互いにネストされたブロックが多すぎるのも特に好きではありません。素敵なパターンですが、読みやすさを妨げることがあります。

4

3 に答える 3

5

まあ、再利用は最適化であり、おそらく時期尚早です。したがって、はい、それは悪い習慣です。明確なパフォーマンスの問題が表面化するのを待ってから、ボトルネックを探します。これらのコンポーネントの状態を管理する複雑さが急速に増大することと引き換えに、(未知の) パフォーマンスの向上をいくらか犠牲にすることになります。

余談ですが、using-block を入れ子にする方法として広く受け入れられている形式の 1 つは、次のようになります。

 using (var a = ...)
 using (var b = ...)
 using (var c = ...)
 {

 }
于 2009-09-29T10:17:07.783 に答える
1

GDI オブジェクトを再利用すること自体は悪いことではありません。何問題かというと、一度に存在する GDI オブジェクトが多すぎて、グラフィック カードのGDI が処理しきれない場合です。

破線のペンといくつかのブラシをキャッシュした結果、以前に問題に直面していました。私の同僚のコード (同じ WM_PAINT 内で実行されている) は、オブジェクトをキャッシュしていませんでしたが、まったく問題がありませんでした! GDI を詰まらせて OutOfMemoryException をスローさせていたのは、私の頭の悪さだけでした (おそらく、グラフィック カードのメモリ不足を意味します)。

于 2009-09-29T10:16:28.960 に答える
1

この慣習には何も悪いことはないと思います。しかし、作成したブラシは再利用できると思います。私自身の UserControls では、ブラシを使用する場合、それらを UserControl のローカル変数に格納し、UserControl を破棄するときにそれらを破棄します。

public class MyUserControl : UserControl{

  private SolidBrush _brush;

  public MyUserControl() {
    _brush = new SolidBrush(Color.Red);
  }

  protected override void OnPaint(PaintEventArgs e){
    // Draw with the brush;
  }

  protected override void Dispose(bool disposing){
    // other Dispose logic
    if (_brush != null) {
      _brush.Dispose();
    }
  }
}
于 2009-09-29T10:17:50.327 に答える