2009-10-15 33 views
6

VB.NETプログラムでは、新しいビットマップイメージを作成しています。次に、Graphics.FromImageを呼び出して、ビットマップに描画するGraphicsオブジェクトを取得します。次に、画像がユーザに表示される。Graphics.Dispose()を呼び出す必要がありますか?

私が見たコードサンプルは、常にビットマップとグラフィックスオブジェクトで.Dispose()を呼び出したものですが、どちらもディスク上のファイルに触れていないときに行う必要はありますか?これらのオブジェクトがガベージコレクタによってクリアされない可能性のある他の管理されていないリソースはありますか?

答えて

5

はい。

IDisposableを実装するオブジェクトには常にDispose()を呼び出します。グラフィックスオブジェクトで使用されるGDIハンドルは管理されておらず、処理が終了したら処分する必要があります。

usingブロックをラップすることをお勧めします。このトピックに関するいくつかのご質問がありました。

+0

申し訳ありません、これが重複している場合。この特定のケースに関連するものは何も見当たりませんでした。この場合、管理されていないリソース(もしあれば)が使用されるのか不思議でした。 – alnorth29

1

はい、Disposeを呼び出す必要があります。ディスクに触れることには関係しません。オペレーティングシステムに適切にリリースする必要があるアンマネージリソースを使用することに関連しています。 Graphicsオブジェクトの場合は、デバイスコンテキストハンドルが割り当てられていることを前提とします。デバイスコンテキストハンドルは、必要なくなった時点で解放する必要があります。

6

文を使用してに囲んでください。その後、処分の呼び出しについて、明示的に心配しないでください()

擬似コード:

using(new Graphics() = Graphics.FromImage) 
{ 
    //Magic happens... 
} 
1

Dispose()とのルールは、あなたがIDisposableであるオブジェクトを作成した場合、その後、あなたはそれを呼び出すことになっているということです。最善の方法はusingブロックまたはfinallyです。

あなたはそれをする必要はなかったかもしれませんが、Dispose()はそれを決定します。

オブジェクトを取得してもコンストラクタを呼び出さなかった場合は、返されたメソッドのドキュメントを調べて、Dispose()を呼び出すかどうかを確認する必要があります。

+0

「使用する」(他の回答を参照)を適切に使用すると、暗黙のうちに「Dispose」が実行されるので、自分で呼び出す必要はありません。 – ToolmakerSteve

0

Graphics implements IDisposableのように、Disposeを呼び出してアンマネージドリソースをクリーンアップする必要があります。

管理対象外のリソースはガベージコレクタによって処理されないため、手動で処理する必要があります。これは、よく定義された特定の時点でクリーンアップを提供するために、通常はDispose()メソッドによって実行されます。ファイナライザによって処理されることもありますが、その場合、リソースは必要以上に長く使用されます。

すべてのケースでDisposeを呼び出す最も簡単な方法は、using構文を使用することです。例えば。

using(var g = Graphics.FromImage()) { 
    // use the resource 
} 
+0

「手作業で処理する必要があります。 'IDisposable'の適切な実装は、(コード内の)手作業がなくても安全であることを確実にしなければなりません。 –

+0

@MaciejDopieralski:私は手動プロセスであるためにコードを書く必要があると考えています。呼出しを忘れた場合は、廃棄処理を行いません。一方、管理対象オブジェクトの収集は自動的に行われます。 –

+0

あなたが自分のクラスについて話しているなら、あなたのコードで 'Dispose'を呼び出さなくても、すべての.NETフレームワーク' IDisposable'クラスは遅かれ早かれ処理されます。 –

関連する問題