鉴于,
using (var abc = new Abc())
{
// abc is not used here at all.
}
abc是否可能在结束大括号之前收集垃圾?
答案 0 :(得分: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
当using
语句被转换为IL代码时,编译器实际上将其转换为完整的try / finally
块,并在.Dispose()
的实例上调用Abc
方法}。所以基本上把它变成了类似的东西:
Abc abc = new Abc();
try
{
}
finally
{
abc.Dispose();
}
答案 1 :(得分:2)
不,它的范围从打开括号到关闭using
和lock
块的括号。所以在这两个括号之间它是非常存在的并且不是垃圾收集你是否使用它。