2

私はこのコードを持っています:

using (var img = Bitmap.FromFile(path))
{
    result = new Bitmap(img);
}

質問:

  1. インスタンスはBitmap、使用の最後にすぐに呼び出されますか? それともガベージコレクションされるのを待っていますか?
  2. 現在のスレッドまたは別のスレッドから破棄されますか?
4

4 に答える 4

3

実際には、 との 2 つのBitmap インスタンスがimgありresultます。

imgusingブロックの最後で破棄されます(現在のスレッドで信じられます) 。コンパイラは、ブロックに Dispose呼び出しを挿入します。finally

resultは自動的に破棄されません。結果を消費するものはすべて破棄する必要があります。

また、廃棄とガベージ コレクションは 2 つの異なるものであることに注意してください。管理されていないリソースはすぐDisposeにクリーンアップされます(ビットマップの場合、基になるグラフィックス オブジェクトになります)。.

于 2013-09-06T16:10:24.853 に答える
2

あなたのコードは次のようになります (これは実際にコンパイラによってコードが変換される方法です)。

try
{
    var img = Bitmap.FromFile(path);
    result = new Bitmap(img);
}
finally
{
    img.Dispose();
}

それを呼び出したことresultがないことに注意してください。オブジェクトを適切に破棄するのは呼び出し元のコード次第です。Dispose

于 2013-09-06T16:16:08.590 に答える
0

usingtry/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。

于 2013-09-06T16:27:40.433 に答える