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

using语句转换为 IL 代码时,编译器实际上将其转换为一个完整的try / finally块,并.Dispose()在您的Abc. 所以基本上它变成了这样的东西:

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

using不,它的范围是从和lock块的左大括号到右大括号。因此,在这两个大括号之间,它非常存在,并且无论您是否使用它都不会被垃圾收集。

于 2012-06-26T02:41:38.843 回答