2

既存のクラスをプログラミングしているときに、誰かが次のようなものを書いていることに気付きました:

using(DisposableObject disp = new DisposableObject())
{
    ...
    ...

    disp.Dispose()
}

そして、私は疑問に思います: using ブロックはオブジェクトを破棄するのに十分ではありませんか? そのような場合に Dispose() が役立つ方法はありますか?

私には意味がないから…

4

5 に答える 5

6

あなたの場合、ステートメントのスコープが終了すると自動的に が呼び出されるため、dispose内部で使用するのは無意味です。そのため、括弧内に Interfaceを実装するオブジェクトのみを記述できます。usingusingdisposeIDisposableusing

using(.......)

dispさらに、その後に objectを使用するステートメントがあるdisp.Dispose()と、エラーが発生します。これは、それまでに object が破棄されている、つまりメモリが解放されているためです。

しかし、注意してください

disposeスコープが終了する前の最後の行である場合using、それは役に立ちません。

ただし、 の後にさらに行がある場合は無駄ではありませんdispose

于 2012-05-21T09:57:03.767 に答える
3

はい、using ブロックは実際には同等であり、次の代替構文です。

var d = new DisposableObject();
try
{
    d.DoSomething();
}
finally
{
    if(d != null)
         ((IDisposable)d).Dispose();
}

「キャッチ」のようなものの代わりに最終的に使用することに注意してください。例外があっても、finally 句は常に実行されます。

于 2012-05-21T10:01:24.917 に答える
0

usingで十分です。2回電話する理由はありませんDispose

于 2012-05-21T09:58:14.000 に答える
0

@Nikhil Agrawalは正しいです。言及する必要があることの 1 つは、Idisposable インターフェイスを実装するときは、何度でも呼び出せるようにする必要があることです。つまり、何らかの検証を行う必要があります。

于 2012-05-22T02:35:11.613 に答える
0

using ブロック内で Dispose を使用できる理由は 2 つあります。

  • using ブロックが終了する前にオブジェクトを破棄したい。この場合、using ブロックは、例外が発生した場合でもオブジェクトが破棄されることを保証する「セーフティ ネット」です。(使用は、オブジェクトが破棄される finally ブロックを持つ try ブロックのように動作します)
  • 呼び出すとDispose、何をしているかがより明確になります。これは典型的です。

トランザクション スコープ:

using(TransactionScope ts=new TransactionScope)
{
  ...
  if (cond)
  {
    ts.Complete();
  }
  else
  {
    ts.Dispose(); // makes it clear you're rolling back the transaction
  }
}

この呼び出しDisposeは必須ではありませんが、「説明」です。トランザクションがロールバックされることがより明白になります。

于 2012-05-21T10:09:18.557 に答える