非常に特定の時点でフラッシュする必要がある重要なリソースを持つ C# オブジェクトがあり、ガベージ コレクターがそれに近づくたびに処理するために残すのは悪い候補です。これをどのように処理すればよいですか? 必要に応じてこのオブジェクトのインスタンスを手動で強制終了できる C++ の削除演算子のようなものはありますか?
6 に答える
あなたが探しているIDisposable
。これを実装するクラスの例を次に示します。
class MyDisposableObject : IDisposable
{
public MyDisposableObject()
{
}
~MyDisposableObject()
{
Dispose(false);
}
private bool disposed;
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
// Dispose of your managed resources here.
}
// Dispose of your unmanaged resources here.
this.disposed = true;
}
}
void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
これを使用するには、次のようなことを行うことができます。
public void DoingMyThing()
{
using (MyDisposableObject obj = new MyDisposableObject())
{
// Use obj here.
}
}
using
キーワードは、onのメソッドがそのスコープの最後で呼び出されることを確認しDispose()
ますIDisposable
。
IDisposableインターフェースは、決定論的破壊のために存在します。MSDNに正しく実装するためのパターンがあります。
同時に、オブジェクトの存続期間が複数のスコープにまたがらない場合は、 usingステートメントの使用を検討する必要があります。
これはまさにIDiposable
インターフェースの目的です。メソッド内の重要なリソースをDispose()
解放し、ガベージ ディスポーザーがメモリの割り当てを解除できるようにオブジェクトを残します。
IDisposable インターフェイスの Google。これは、利用できる唯一のメカニズムです。重要なリソースが管理されていない場合は、オーダーメイドです。それが管理されたリソースである場合、「フラッシュ」する必要があるものについてより具体的に教えてください。
IDisposable インターフェイスは、C++/CLI での決定論的破棄をサポートするために追加され、任意の .NET 言語から使用できます。それはあなたが望むものです。
特定の時間に解放する必要がある特定の管理対象リソースについて話している場合は、オブジェクトを逆参照した後、ガベージ コレクターの Collect メソッドを具体的に呼び出すことができますが、考慮すべきパフォーマンス上の考慮事項があります。通常、ガベージ コレクターはいつアイテムを収集するかを知っています。そして、一般的にそれは悪い考えです。
他の人が上で言及しているように、IDisposable パターンは、必要に応じて管理されていないリソースを解放するのに役立ちます。
注:繰り返しますが、GC.Collect() を呼び出すことはできますが、これは良いことではありませんが、質問に対する有効な回答です!