1

次のコードがあります。

using System.Drawing;
...
Graphics _graphics = Graphics.FromImage(...)
...
public void Draw(Stream stream, Rectangle rect, Color color) {
    _graphics.FillRectangle(new SolidBrush(Color), 0, 0, Width, Height);
    _graphics.DrawImage(new Bitmap(stream), rect);
}

on を使用して drawImage を囲む必要がありnew Bitmap(...)ますか? に関する同じ質問new SolidBrush(...)

4

2 に答える 2

4

はい、ステートメントを使用してそれらをラップする必要があります。_graphicsまた、このクラスで使用しているインスタンスでDispose メソッドが呼び出されるようにする必要があります。これは、このクラスの消費者がそれをステートメントIDisposableでラップできるように、包含クラスを実装することで実行できます。using

于 2012-12-25T09:43:41.437 に答える
2

はい、これらのリソースを処分することは重要です。特にビットマップは厄介です。ピクセル データを格納するために大量のアンマネージ メモリを消費しますが、マネージ ビットマップ クラス ラッパーは非常に小さいです。ガベージ コレクションをトリガーする前に多数の Bitmap オブジェクトを作成すると、アンマネージ メモリが残っていないために Bitmap コンストラクターが失敗し始める可能性が高くなります。

そこで、次のように書き換えます。

public void Draw(Stream stream, Rectangle rect, Color color) {
    using (var bmp = new Bitmap(stream))
    using (var brush = new SolidBrush(Color)) {
        _graphics.FillRectangle(brush, 0, 0, Width, Height);
        _graphics.DrawImage(bmp, rect);
    }
}
于 2012-12-25T14:42:59.973 に答える