参考是否可能是GC'd当前被“使用”块消耗的?

时间:2012-06-26 02:38:58

标签: c# .net garbage-collection

鉴于,

using (var abc = new Abc())
{

    // abc is not used here at all.

 }

abc是否可能在结束大括号之前收集垃圾?

2 个答案:

答案 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)

不,它的范围从打开括号到关闭usinglock块的括号。所以在这两个括号之间它是非常存在的并且不是垃圾收集你是否使用它。