180

私はいくつかのコードを見ていますが、次のステートメントがあります。

~ConnectionManager()
{
    Dispose(false);
}

クラスはIDisposableインターフェイスを実装していますが、それがチルダ(~)が使用されているものの一部であるかどうかはわかりません。

4

6 に答える 6

228

~ はデストラクタです

  1. デストラクタは自動的に呼び出され、明示的に呼び出すことはできません。
  2. デストラクタはオーバーロードできません。したがって、クラスは、最大で 1 つのデストラクタを持つことができます。
  3. デストラクタは継承されません。したがって、クラスには、クラスで宣言できるもの以外のデストラクタはありません。
  4. デストラクタは構造体では使用できません。それらはクラスでのみ使用されます。どのコードでもインスタンスを使用できなくなると、そのインスタンスは破棄の対象になります。
  5. インスタンスのデストラクタの実行は、インスタンスが破棄の対象になった後いつでも発生する可能性があります。
  6. インスタンスが破棄されると、その継承チェーン内のデストラクタが、最も派生したものから最も派生していないものへと順番に呼び出されます。

ファイナライズ

C# では、Finalize メソッドは、標準の C++ デストラクターが実行する操作を実行します。C# では、Finalize という名前を付けません。クラス名の前にチルダ ( ~ ) 記号を配置する C++ デストラクタ構文を使用します。

廃棄

クラスのユーザーが明示的に呼び出すことができるClose()orメソッド内のオブジェクトを破棄することをお勧めします。Dispose()Finalize (デストラクタ) は GC によって呼び出されます。

IDisposableインターフェイスは、破棄する必要のあるリソースをクラスが保持していることを世界に伝え、ユーザーにリソースを解放する方法を提供します。クラスにファイナライザーを実装する必要がある場合は、Dispose メソッドでメソッド使用してGC.SuppressFinalize()、インスタンスのファイナライズが抑制されるようにする必要があります。

何を使う?

デストラクタを明示的に呼び出すことは合法ではありません。デストラクタはガベージ コレクタによって呼び出されます。貴重なアンマネージ リソース (ファイル ハンドルなど) を処理して、できるだけ早く閉じて破棄したい場合は、IDisposable インターフェイスを実装する必要があります。

于 2008-10-09T19:05:46.577 に答える
46

これはファイナライザーです。正直なところ、ファイナライザーを記述する必要はほとんどありません。次の場合は、実際に 1 つだけ記述する必要があります。

  • 管理されていないリソースに (たとえば、 を介して) 直接アクセスIntPtrでき、使用できないためSafeHandle、より簡単になります
  • IDisposable封印されていないクラスに実装しています。(私の好みは、クラスが継承用に設計されていない限り、封印することです。) そのような場合、ファイナライザーは正規の Dispose パターンの一部です。
于 2008-10-09T19:04:29.527 に答える
9

クラスのデストラクタを示すために使用されます。

于 2008-10-09T19:02:12.013 に答える
5

C++ と同じ、デストラクタです。ただし、C# では明示的に呼び出しません。ガベージ コレクターによってオブジェクトが収集されたときに呼び出されます。

于 2008-10-09T19:02:35.460 に答える
3

デストラクタ (C# プログラミング ガイド)を参照してください。ただし、C++ とは異なり、デストラクタが呼び出されるタイミングはガベージ コレクタによって決定されるため、プログラマは制御できないことに注意してください。

于 2008-10-09T19:10:15.413 に答える
1

~ は通常、デコンストラクタを表します。オブジェクトが死ぬ直前に実行されます。

これは、私が見つけたC#デコンストラクターの説明です

于 2008-10-09T19:02:44.803 に答える