4

usingブロックは、IDisposable「使用」されているオブジェクトがブロックの最後に破棄されることを保証しますが、それより前にオブジェクトが破棄されないことを保証しますか?

言い換えれば、私が持っている場合:

using (new DisposableObject()) {
  // blah blah
}

がブロックの最後まで破棄されないことを確認できますかDisposableObject、またはガベージコレクターがブロック内にハンドルがないことを検出し、すぐに破棄する可能性がありますか?

4

3 に答える 3

6

いいえ、そうではありません。あなたの行動を妨げるものは何もありません:

using(var myObject = new DisposableObject())
{
    myObject.Dispose();
}

この場合に正確に何が起こるかは、 のセマンティクスによって異なりDisposableObjectます。例外がスローされる場合もあれば、Dispose2 回呼び出されても問題ない場合もあります。

オブジェクトの破棄とガベージ コレクションはまったく異なる概念であることに注意してください。オブジェクトが破棄されたからといって、それがガベージ コレクションされるわけではありません。また、オブジェクトがガベージ コレクションされたからといって、それが破棄されるわけでもありません。

オブジェクトへのすべての参照が破棄されるか到達不能になると、オブジェクトはガベージ コレクションされる場合があります。usingブロック自体がオブジェクトへの参照を持っているため、コードが -block 内で実行されている間は発生しません。

于 2013-07-07T20:04:49.007 に答える
4

オブジェクトは 1 回だけ破棄され、using ブロックが終了する前に GC されることはありません。

using (expression) statement仕様では、式の型が null 許容型 ( it と呼ぶResourceType) の場合、次のように展開されることが保証されています。

{
   ResourceType resource = expression;
   try {
      statement;
   }
   finally {
      if (resource != null) ((IDisposable)resource).Dispose();
   }
}

Disposeブロックの最後に一度呼び出され、使い捨てオブジェクトへの参照を保持するローカルが生成されます。local は、using ブロックの終了前にオブジェクトが GC されるのを防ぎます。

于 2013-07-07T20:16:08.813 に答える
2

廃棄するよりもガベージコレクションについて知りたいと思います。

usingガベージ コレクターは、ブロック内のオブジェクトを収集しません。メソッドを明示的に呼び出してもDispose、それへのアクティブな参照がまだあるため、収集されません。

ブロック用に生成されたコードはusing、オブジェクトを破棄できるかどうかを確認することで終了しますusing

于 2013-07-07T20:14:23.180 に答える