using语句是否只处理它创建的第一个变量?

时间:2013-06-26 10:10:12

标签: c# idisposable using

假设我有一个一次性对象MyDisposable,它将另一个一次性对象作为构造函数参数。

using(MyDisposable myDisposable= new MyDisposable(new AnotherDisposable()))
{
     //whatever
}

假设myDisposable没有将AnotherDisposable置于其处置方法中。

这只能正确处理myDisposable吗?或者它也处理AnotherDisposable

6 个答案:

答案 0 :(得分:9)

using相当于

MyDisposable myDisposable = new MyDisposable(new AnotherDisposable());
try
{
    //whatever
}
finally
{
    if (myDisposable != null)
        myDisposable.Dispose();
}

因此,如果myDisposable未在AnotherDisposable上调用Dispose,则using也不会调用它。

答案 1 :(得分:5)

为什么不嵌套呢?

using(var outer = new AnotherDisposable())
{
   using(var inner = new MyDisposable(outer))
   {
      //whatever
   }

}

现在至少你可以确定它们会被正确处理掉。

答案 2 :(得分:1)

它没有“处置”任何东西。它调用其中使用的对象的Dispose方法。你的工作是清理其他任何东西......也许是通过调用另一个对象上的处理。

答案 3 :(得分:0)

在这种情况下,它不会处置AnotherDisposable。有两种解决方案。

首先,您通常会做以下事情:

using (AnotherDisposable anotherDisposable = new AnotherDisposable())
using (MyDisposable myDisposable= new MyDisposable(anotherDisposable))
{
}

但是,还有不同的方法。通常情况下,当一个人使用一次性用品时,它本身会负责处理所用的物品。例如。包裹StreamReader的{​​{1}}会处理它所包含的Stream。这意味着您选择的构造将起作用。您可以在Stream中实现相同的功能,然后您采用的方法就可以了。

答案 4 :(得分:0)

C#的using语句提供了一个用于调用Dispose on objects的语法快捷方式 使用try / finally块实现IDisposable。例如:

using (FileStream fs = new FileStream ("myFile.txt", FileMode.Open))
{
// ... Write to the file ...
}

编译器将其转换为: FileStream fs = new FileStream(“myFile.txt”,FileMode.Open);

try
{
// ... Write to the file ...
}
finally
{
if (fs != null) ((IDisposable)fs).Dispose();
}

finally块确保即使出现异常也会调用Dispose方法 抛出,1或代码提前退出块。

因此,使用单个块只会确保处理单个一次性对象。另一方面,您可以使用嵌套的using语句。喜欢

using (myDisposable d = new myDisposable())
{
  using(Disposable2 d2 = new Disposable2())
  {
// do something and dispose...
  }
}

,这将转换为

try
{
  // work around for myDisposable  

    try
     {
      // work around for Disposable2 
     }
    finally
    {
    if (d2 != null) 
         ((IDisposable)d2 ).Dispose();
    }    
}
finally
{
     if (d!= null)
          ((IDisposable)d).Dispose();
}

答案 5 :(得分:0)

您只在using语句中初始化了一个一次性变量。 AnotherDisposable嵌套对象是通过正常初始化而不是using创建的。因此,只有您使用myDisposable语句创建的using变量才会自动处理。