1

与えられた、

using (var abc = new Abc())
{

    // abc is not used here at all.

 }

エンディングカーリーブレースの前にabcがガベージコレクションされる可能性はありますか?

4

2 に答える 2

5

番号。内部的にはabc、最後のカーリーブレースまで保持されている参照があります。

生成されたILコードは次のようになります。

  IL_0001:  newobj     instance void ConsoleApplication1.Abc::.ctor()
  IL_0006:  stloc.0
  .try
  {
    IL_0007:  nop
    IL_0008:  nop
    IL_0009:  leave.s    IL_001b
  }  // end .try
  finally
  {
    IL_000b:  ldloc.0
    IL_000c:  ldnull
    IL_000d:  ceq
    IL_000f:  stloc.1
    IL_0010:  ldloc.1
    IL_0011:  brtrue.s   IL_001a
    IL_0013:  ldloc.0
    IL_0014:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()
    IL_0019:  nop
    IL_001a:  endfinally
  }  // end handler

ステートメントがusingILコードに変換されると、コンパイラーは実際にそれを完全なtry / finallyブロックに変換し.Dispose()、のインスタンスでメソッドを呼び出しますAbc。つまり、基本的には次のようになります。

Abc abc = new Abc();
try
{
}
finally
{
    abc.Dispose();
}
于 2012-06-26T02:40:13.583 に答える
2

いいえ、その範囲は、中括弧を開くことから中括弧usinglockブロックを閉じることまでです。したがって、これら2つの中括弧の間には非常に多く、使用しているかどうかに関係なくガベージコレクションは行われません。

于 2012-06-26T02:41:38.843 に答える