使用块计数作为它捕获的IDisposable的引用吗?

Tim*_*lds 3 .net c# garbage-collection

假设我已经定义了以下方法.

static object F()
{
    return new object();
}
Run Code Online (Sandbox Code Playgroud)

如果我编写如下代码,则object在范围结束之前不能对返回的内容进行垃圾回收.

{
    object x = F();
    // cannot yet garbage collect the object
    // returned by F (referenced as variable x)
}
// can now garbage collect the object
// returned by F (referenced as variable x)
Run Code Online (Sandbox Code Playgroud)

如果我编写如下代码,返回后object可以立即回收垃圾F.

{
    F();
    // can now garbage collect the object
    // returned by F
}
Run Code Online (Sandbox Code Playgroud)

但现在假设我将定义更改F为以下内容.

static IDisposable F()
{
    return new SomeDisposableObject();
}
Run Code Online (Sandbox Code Playgroud)

如果我编写如下代码,则返回的对象不能被垃圾收集,并且在using块结束之前不会被丢弃.

using (IDisposable x = F())
{
} // immediately x.Dispose()
// can now garbage collect the object
// returned by F
Run Code Online (Sandbox Code Playgroud)

如果我编写如下代码,那么行为是什么?引用C#语言规范是一个优点.

using (F())
{
}
Run Code Online (Sandbox Code Playgroud)

using块是否计为对返回的实例的引用F

SLa*_*aks 6

是.

你不能在没有参考的情况下处置某些东西.

该规范的状态using (expression) { statement }被编译为:

{
   ResourceType resource = expression;
   try {
      statement;
   }
   finally {
      if (resource != null) ((IDisposable)resource).Dispose();
   }
}
Run Code Online (Sandbox Code Playgroud)

resource 是一个参考.