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

本文关键字:创建 第一个 变量 处理 语句 是否 using | 更新日期: 2023-09-27 18:19:52

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

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

假设myDisposable不在其dispose方法中处理AnotherDisposable

这是否只正确处理myDisposable?或者它也处理AnotherDisposable

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

using相当于

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

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

为什么不嵌套它们?

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

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

它不会"处置"任何东西。它调用其中使用的对象的Dispose方法。你的工作是清理其他任何东西。。也许是通过对另一个对象调用dispose。

C#的using语句提供了对对象调用Dispose的语法快捷方式实现IDisposable的,使用try/finaly块。例如:

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

编译器将其转换为:FileStream fs=新的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();
}

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

首先,您通常会做以下操作:

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

然而,还有另一条路要走。当一个类接受一次性物品时,它自己会处理它所接受的对象,这是很正常的。例如,封装StreamStreamReader将丢弃其封装的Stream。这意味着你选择的结构会起作用。您可以在MyDisposable中实现相同的功能,然后您所采用的方法就可以了。

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