如果返回在内部,将使用销毁数据

时间:2018-07-14 18:17:21

标签: c# using

我想知道在处理项目时,如果return会在use的内部使用,则会使用自动销毁数据。

示例代码块:

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

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

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

这是一个问题,实现IDisposable的ManagedObject是否可以通过“使用”语句处理?

4 个答案:

答案 0 :(得分:1)

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();
}

我认为,由于此代码示例,可以看到您问题的答案。

答案 1 :(得分:0)

using是一种语法糖,当您离开IDisposable范围时,它需要包含一个实现using接口的对象。.net将自动调用IDisposable.Dispose方法。

这是一个示例c# online

程序退出Test方法时。 .net将自动调用IDisposable.Dispose方法

答案 2 :(得分:0)

是的,它将调用由Dispose()接口实现的IDisposable函数

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");
    }
}

答案 3 :(得分:0)

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

请注意,返回usualNumber很好,但是如果要返回obj,则可能会出现问题,因为您将返回“已处置”对象。

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