与えられた、
using (var abc = new Abc())
{
// abc is not used here at all.
}
エンディングカーリーブレースの前にabcがガベージコレクションされる可能性はありますか?
与えられた、
using (var abc = new Abc())
{
// abc is not used here at all.
}
エンディングカーリーブレースの前にabcがガベージコレクションされる可能性はありますか?
番号。内部的には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
ステートメントがusing
ILコードに変換されると、コンパイラーは実際にそれを完全なtry / finally
ブロックに変換し.Dispose()
、のインスタンスでメソッドを呼び出しますAbc
。つまり、基本的には次のようになります。
Abc abc = new Abc();
try
{
}
finally
{
abc.Dispose();
}
いいえ、その範囲は、中括弧を開くことから中括弧using
とlock
ブロックを閉じることまでです。したがって、これら2つの中括弧の間には非常に多く、使用しているかどうかに関係なくガベージコレクションは行われません。