私はこのコードを持っています:
using (var img = Bitmap.FromFile(path))
{
result = new Bitmap(img);
}
質問:
- インスタンスは
Bitmap
、使用の最後にすぐに呼び出されますか? それともガベージコレクションされるのを待っていますか? - 現在のスレッドまたは別のスレッドから破棄されますか?
私はこのコードを持っています:
using (var img = Bitmap.FromFile(path))
{
result = new Bitmap(img);
}
質問:
Bitmap
、使用の最後にすぐに呼び出されますか? それともガベージコレクションされるのを待っていますか?実際には、 との 2 つのBitmap インスタンスがimg
ありresult
ます。
img
using
ブロックの最後で破棄されます(現在のスレッドで信じられます) 。コンパイラは、ブロックに Dispose
呼び出しを挿入します。finally
result
は自動的に破棄されません。結果を消費するものはすべて破棄する必要があります。
また、廃棄とガベージ コレクションは 2 つの異なるものであることに注意してください。管理されていないリソースはすぐDispose
にクリーンアップされます(ビットマップの場合は、基になるグラフィックス オブジェクトになります)。.
あなたのコードは次のようになります (これは実際にコンパイラによってコードが変換される方法です)。
try
{
var img = Bitmap.FromFile(path);
result = new Bitmap(img);
}
finally
{
img.Dispose();
}
それを呼び出したことresult
がないことに注意してください。オブジェクトを適切に破棄するのは呼び出し元のコード次第です。Dispose
using
はtry/finally
パターンのシンタックス シュガーであり、括弧が閉じられた後、Img.Dispose();
後ろに呼び出されます。
using (var img = Bitmap.FromFile(path))
{
result = new Bitmap(img);
} // here Dispose will be immediately called.
if you are using img/result here you will get an Exception.
スレッドはこの問題とは何の関係もありません!現在のスレッドで常に呼び出された Dispose。