1. ホーム
  2. c#

[解決済み] C#の関数名の前のチルダは何を意味するのですか?

2022-04-20 03:27:29

質問

あるコードを見ていたら、次のような記述がありました。

~ConnectionManager()
{
    Dispose(false);
}

このクラスは IDisposable インターフェイスを使用していますが、チルダ(~)がそのために使用されているのかどうかはわかりません。

どのように解決するのですか?

~ はデストラクタです。

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

ファイナライズ

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

ディスポ

オブジェクトのディスポーザブルは Close() または Dispose() メソッドで、クラスのユーザが明示的に呼び出すことができます。Finalize(デストラクタ)はGCによって呼び出されます。

IDディスポーザブル インターフェイスは、あなたのクラスが廃棄する必要のあるリソースを保持し、ユーザーに解放する方法を提供することを世界に伝えます。クラスでファイナライザーを実装する必要がある場合は、Disposeメソッドに を使用します。 GC.SuppressFinalize() メソッドを使用して、インスタンスのファイナライズを確実に抑制します。

何を使うか?

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