如果 return 将在里面,将使用销毁数据

Will using destroy data if return will be inside

在处理我的项目时,我想知道,如果 return 将在 using 中,是否会使用自动销毁数据。

示例代码块:

using(ManagedObject obj = new ManagedObject()) 
{
    int usualNumber = 0;

    // some magic stuff
    ...
    // magic stuff ends

    return usualNumber; // return goes inside of 'using' brackets
}

问题来了,我们实现了 IDisposable 的 ManagedObject 会被 'using' 语句处理掉吗?

using是一个语法糖,它需要包含一个实现IDisposable接口的对象,当你离开using作用域时.net会调用IDisposable.Dispose方法自动。

这是一个示例 c# online

当程序离开Test方法时。 .net 将自动调用 IDisposable.Dispose 方法

using语句可以看作是tryfinally的组合。

您的代码等同于:

ManagedObject obj = new ManagedObject();

try
{
  int usualNumber = 0;

  // some magic stuff
  ...
  // magic stuff ends

  return usualNumber;
}
finally
{
  if (obj != null)
    ((IDisposable)obj ).Dispose();
}

我想,您的问题的答案可以通过这个代码示例看到。

是的,会调用IDisposable接口实现的Dispose()函数

class Program
{
    static void Main(string[] args)
    {
        new Test().TestIt();
        Console.Read();
    }
}

class Test
{
    public int TestIt()
    {
        using (ManagedObject obj = new ManagedObject())
        { 
            int usualNumber = 0;       
            return usualNumber;
        }
    }
}

internal class ManagedObject : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("Disposed");
    }
}

是的,即使您从 using 块中 return,它仍然会在 obj 上调用 Dispose

请注意 return 使用 usualNumber 完全没问题,但是如果您要 return obj,那可能是个问题,因为您会 returning 一个 "disposed" 对象。

(从技术上讲,对象可以在调用 Dispose 后使用。例如,您可以实现一个不执行任何操作的 Dispose。但是通常,大多数 Dispose 实现会将对象放在一个不可用状态)。