質問
いくつかのコードを見ていますが、次のステートメントがあります:
~ConnectionManager()
{
Dispose(false);
}
クラスは IDisposable
インターフェースを実装していますが、チルダ(〜)が使用されているものの一部かどうかはわかりません。
解決
〜はデストラクタです
- デストラクタは自動的に呼び出され、明示的に呼び出すことはできません。
- デストラクタはオーバーロードできません。したがって、クラスには最大で1つのデストラクタを含めることができます。
- デストラクタは継承されません。したがって、クラスには、クラス内で宣言できるデストラクタ以外のデストラクタはありません。
- デストラクタは構造体とともに使用できません。クラスでのみ使用されます。 コードを使用してインスタンスを使用できなくなると、インスタンスは破棄の対象になります。
- インスタンスのデストラクタの実行は、インスタンスが破棄の対象になった後であればいつでも実行できます。
- インスタンスが破棄されると、継承チェーン内のデストラクタが、最も派生したものから最も派生しないものの順に呼び出されます。
最終化
C#では、Finalizeメソッドは標準C ++デストラクタが行う操作を実行します。 C#では、Finalizeという名前を付けません。クラス名の前にチルダ(〜)シンボルを配置するC ++デストラクタ構文を使用します。
廃棄
クラスのユーザーが明示的に呼び出すことができる Close()
または Dispose()
メソッドでオブジェクトを破棄することをお勧めします。ファイナライズ(デストラクタ)はGCによって呼び出されます。
IDisposable インターフェースは、クラスが破棄する必要があるリソースを保持していることを世界に伝え、ユーザーにそれらを解放する方法を提供します。クラスにファイナライザを実装する必要がある場合、Disposeメソッドは、 GC.SuppressFinalize()
メソッドを使用して、インスタンスのファイナライズが確実に抑制されるようにする必要があります。
使用するもの
デストラクタを明示的に呼び出すことは違法です。デストラクタは、ガベージコレクタによって呼び出されます。できるだけ早く閉じて破棄する貴重なアンマネージリソース(ファイルハンドルなど)を処理する場合は、IDisposableインターフェイスを実装する必要があります。
他のヒント
これはファイナライザーです。正直に言うと、ファイナライザーを作成する必要はほとんどありません。本当に必要なのは、次の場合のみです。
- アンマネージリソースに直接アクセスでき(たとえば、
IntPtr
を使用)、SafeHandle
を使用できないため、簡単になります - 封印されていないクラスに
IDisposable
を実装しています。 (継承のために設計されていない限り、クラスを封印することです。)ファイナライザは、このような場合の標準的なDisposeパターンの一部です。
クラスのデストラクタを示すために使用されます。
C ++と同じ、デストラクタです。ただし、C#では明示的に呼び出さず、オブジェクトが収集されるときに呼び出されます。
デストラクタ(C#プログラミングガイド)を参照してください。ただし、C ++とは異なり、プログラマはデストラクタがいつ呼び出されるかを制御できません。これは、ガベージコレクタによって決定されるためです。
〜は通常、解体者を表します。オブジェクトが死ぬ直前に実行されます。