鉴于,
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
块的左大括号到右大括号。因此,在这两个大括号之间,它非常存在,并且无论您是否使用它都不会被垃圾收集。