6

MyDisposableコンストラクターのパラメーターとして別の使い捨てオブジェクトを取る使い捨てオブジェクトがあるとします。

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

dispose メソッドの内部を破棄myDisposableしないと仮定します。AnotherDisposable

これは正しく処分するだけmyDisposableですか?またはそれも処分しAnotherDisposableますか?

4

6 に答える 6

10

usingと同等です

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

したがって、myDisposableDispose on を呼び出さないAnotherDisposable場合は、それも呼び出しませんusing

于 2013-06-26T10:13:08.280 に答える
5

それらを入れ子にしないのはなぜですか?

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

}

これで、少なくともそれらが正しく破棄されることを確認できます。

于 2013-06-26T10:12:57.137 に答える
1

何も「処分」しません。Disposeその中で使用されるオブジェクトのメソッドを呼び出します。それ以外のものをクリーンアップするのはあなたの仕事です..おそらく、他のオブジェクトで dispose を呼び出すことによって。

于 2013-06-26T10:12:48.257 に答える
0

C# の using ステートメントは、try/finally ブロックを使用して、IDisposable を実装するオブジェクトで Dispose を呼び出すための構文上のショートカットを提供します。例えば:

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 メソッドが呼び出されるようにします。

したがって、単一のブロックを使用すると、単一の使い捨てオブジェクトが破棄されることが保証されます。一方、ネストされた 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();
}
于 2013-06-26T10:23:51.740 に答える
0

この場合、 は破棄されませんAnotherDisposable。これには 2 つの解決策があります。

まず、通常行うことは次のとおりです。

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

ただし、別の方法があります。クラスがディスポーザブルを取得する場合、クラス自体が取得したオブジェクトの破棄を処理するのが普通です。たとえば、StreamReaderそれをラップするものStreamは、ラップするものをStream破棄します。つまり、選択した構成が機能するということです。これと同じ機能を に実装するMyDisposableと、採用したアプローチは問題ありません。

于 2013-06-26T10:13:38.657 に答える
0

usingステートメントで使い捨て変数を 1 つだけ初期化しました。AnotherDisposableネストされたオブジェクトは、 ではなく、通常の初期化によって作成されますusing。したがって、ステートメントmyDisposableで作成した変数のみusingが自動的に破棄されます。

于 2017-10-12T14:36:07.143 に答える