ばかげた質問で申し訳ありませんが、オブジェクトを明示的に破棄した後は、そのオブジェクトを再度参照するべきではありません...よね?
例: これは一般的に悪い考えですよね?
SomeObject o = new SomeObject();
o.DoStuff();
o.Dispose();
o.DoMoreStuff();
また、このようなことをする必要がある状況はありますか?
ばかげた質問で申し訳ありませんが、オブジェクトを明示的に破棄した後は、そのオブジェクトを再度参照するべきではありません...よね?
例: これは一般的に悪い考えですよね?
SomeObject o = new SomeObject();
o.DoStuff();
o.Dispose();
o.DoMoreStuff();
また、このようなことをする必要がある状況はありますか?
必要になるまでオブジェクトを破棄することはありません。オブジェクトを破棄するということは、それがもう必要ないということです。そして、オブジェクトが不要になったら、破棄します (破棄可能な場合)。したがって、破棄された後にオブジェクトにアクセスするポイントはありません。
オブジェクトを破棄すると、管理されていないリソースをすべて解放するように指示されるため、自問しなければならない問題は、「それらのリソースがなくても、オブジェクトは意味のあることを実行できるか」ということです。それはオブジェクトの詳細に依存します。
ほとんどのIDisposable
オブジェクトは、インスタンスを破棄した後にメソッドを呼び出そうとすると、例外がスローされるか、さらに悪いことに、予期しない動作をするように設計されています。
破棄された後でも、他のオブジェクトが意味のあることを行う可能性があります。たとえば、DataTable は IDisposable を実装しますが、意味のあるデータはアンマネージド リソースではなく、マネージド リソースに格納される傾向があります。現在の実装 (変更される可能性があります) では、そのDispose
メソッドは何もしないので、破棄された後に使用しても問題ありません。(とは言っても、まだ使う予定があるのに処分しなければなら ないやむを得ない理由はありません。)
オブジェクトが破棄された後に必要なリソースを再作成することも考えられます (それは悪い考えですが、それでも可能です)。
そうは言っても、破棄された後でも使用する予定のオブジェクトを具体的に設計することは悪い習慣と見なされます。また、使用が完了するまで破棄しないことが Disposable オブジェクトの意図でもあります。それと。ここでのポイントは、それを行うべきではなく、しばしばあなたの顔に吹き飛ばされますが、それはクラスが実装される方法として (慣習に沿って) 選択されたからであり、それが技術的なものだからではありません。要件。
理論的には、そのオブジェクトを破棄して使用し続けることができるクラスを作成することを妨げるものはまったくありませんが、これが望ましい単一の状況を考えることはできません(オブジェクトが持っているかどうかを確認する以外は)破棄されました(例:IsDisposed)。
通常、使用されるパターンは、破棄されたオブジェクトを単に破棄し、必要に応じてそれらを再作成することです。実際、多くの場合、破棄されたオブジェクトにアクセスしようとすると、ObjectDisposedException
スローされます。を実装するオブジェクトを作成する場合は、IDisposable
この規則に従うことをお勧めします。
破棄されたオブジェクトと破棄されていないオブジェクトを追跡するのに役立つように(また、例外がスローされた場合でもオブジェクトが確実に破棄されるように)、次のusing
ステートメントを使用します。
using (SomeObject o = new SomeObject())
{
o.DoStuff();
}
IDisposable を実装するときにこのパターンを使用するのが好きです...
private bool m_disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
if (!m_disposed)
{
if (disposing)
// Cleanup and close resources
m_disposed = true;
}
}
次に、クラス内の他のすべてのメソッドでこれを行います...
public void DoMoreStuff()
{
if (m_disposed)
throw new ObjectDisposedException();
// Your code here
}
public void DoStuff()
{
if (m_disposed)
throw new ObjectDisposedException();
// Your code here
}