web-dev-qa-db-ja.com

C#では、関数名の前のチルダは何を意味しますか?

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

~ConnectionManager()
{
    Dispose(false);
}

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

148
Keith Sirmons

〜はデストラクタです

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

最終化

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

破棄

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

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

使用するもの

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

190

これは ファイナライザー です。正直に言うと、ファイナライザーを作成する必要はほとんどありません。本当に必要なのは、次の場合のみです。

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

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

8
torial

C++と同じ、デストラクタです。ただし、C#では明示的に呼び出さず、オブジェクトが収集されるときに呼び出されます。

4

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

3
Jeff Stong

〜は通常、解体者を表します。オブジェクトが死ぬ直前に実行されます。

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

1
stephenbayer