既存のクラスをプログラミングしているときに、誰かが次のようなものを書いていることに気付きました:
using(DisposableObject disp = new DisposableObject())
{
...
...
disp.Dispose()
}
そして、私は疑問に思います: using ブロックはオブジェクトを破棄するのに十分ではありませんか? そのような場合に Dispose() が役立つ方法はありますか?
私には意味がないから…
既存のクラスをプログラミングしているときに、誰かが次のようなものを書いていることに気付きました:
using(DisposableObject disp = new DisposableObject())
{
...
...
disp.Dispose()
}
そして、私は疑問に思います: using ブロックはオブジェクトを破棄するのに十分ではありませんか? そのような場合に Dispose() が役立つ方法はありますか?
私には意味がないから…
あなたの場合、ステートメントのスコープが終了すると自動的に が呼び出されるため、dispose
内部で使用するのは無意味です。そのため、括弧内に Interfaceを実装するオブジェクトのみを記述できます。using
using
dispose
IDisposable
using
using(.......)
disp
さらに、その後に objectを使用するステートメントがあるdisp.Dispose()
と、エラーが発生します。これは、それまでに object が破棄されている、つまりメモリが解放されているためです。
しかし、注意してください
dispose
スコープが終了する前の最後の行である場合using
、それは役に立ちません。
ただし、 の後にさらに行がある場合は無駄ではありませんdispose
。
はい、using ブロックは実際には同等であり、次の代替構文です。
var d = new DisposableObject();
try
{
d.DoSomething();
}
finally
{
if(d != null)
((IDisposable)d).Dispose();
}
「キャッチ」のようなものの代わりに最終的に使用することに注意してください。例外があっても、finally 句は常に実行されます。
using
で十分です。2回電話する理由はありませんDispose
。
@Nikhil Agrawalは正しいです。言及する必要があることの 1 つは、Idisposable インターフェイスを実装するときは、何度でも呼び出せるようにする必要があることです。つまり、何らかの検証を行う必要があります。
using ブロック内で Dispose を使用できる理由は 2 つあります。
Dispose
、何をしているかがより明確になります。これは典型的です。トランザクション スコープ:
using(TransactionScope ts=new TransactionScope)
{
...
if (cond)
{
ts.Complete();
}
else
{
ts.Dispose(); // makes it clear you're rolling back the transaction
}
}
この呼び出しDispose
は必須ではありませんが、「説明」です。トランザクションがロールバックされることがより明白になります。