1

インラインで宣言されたオブジェクト(ブラシ、色、フォントなど)を一度だけ使用する大規模なプロジェクトがあります。

VS2010でコード分析ツールを実行すると、すべてのパスに配置されないオブジェクトがあるという警告が表示されます。

以下のコード行を考えると、発生したアイテムが使用されなくなったとき、または例外が発生したときに明示的に破棄されるようにするにはどうすればよいですか。

g.DrawString(stringNames[i],
     (Font)new Font("Segoe UI", 7, FontStyle.Regular),
     (Brush)Brushes.Black, 
     new Point(hStart.X - 12, hStart.Y - 6));

前もって感謝します

4

4 に答える 4

3

オブジェクトをステートメントGraphics内にラップすることで、使用後すぐにオブジェクトを確実に破棄できます。using同じことが、を実装するすべてのオブジェクトにも当てはまりますIDisposable

using (Graphics g = e.Graphics)  // Or wherever you are getting your graphics context
{
    using(Font font = new Font("Segoe UI", 7, FontStyle.Regular))
    {
        g.DrawString(stringNames[i], font, Brushes.Black, new Point(hStart.X - 12, hStart.Y - 6));
    }
}

ちなみに、上記の例では、FontまたはBrushオブジェクトを明示的にキャストする必要はありません。これらはすでに強く型付けされています。

于 2012-05-02T16:40:41.967 に答える
2

インラインで宣言されたオブジェクトを破棄することはできません。オフラインで移動する必要があります。

using (Font font = new Font(...))
   graphics.DrawString(..., font, ...);

ただし、ペイントするたびに同じフォントを作成する場合は、一度作成して、それを使用するコントロールにアタッチすることを検討する必要があります。

class MyControl : Control
{
    private Font segoe7Font = new Font(...);

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            segoe7Font.Dispose();
        base.Dispose(disposing);
    }
}
于 2012-05-02T16:45:28.183 に答える
1

そのように管理されていないリソースを要求しないでください。

于 2012-05-02T16:41:13.237 に答える
0
using (var f = new Font("Segoe UI", 7, FontStyle.Regular))
    g.DrawString(stringNames[i], f, (Brush)Brushes.Black, new Point(hStart.X - 12, hStart.Y - 6)); 
于 2012-05-02T16:41:20.077 に答える