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


164

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

~ConnectionManager()
{
    Dispose(false);
}

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

回答:


213

〜はデストラクタです

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

ファイナライズ

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

廃棄

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

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

何を使う?

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


3
昔はどうだったかわかりません。しかし、今ではデストラクタが継承されます。詳細については、このリンクを確認してください(最後の例を確認してください
RononDex

1
あなたがリンクしているページそのものの@RononDexポイント3は、「ファイナライザは継承できない」と述べており、コメントと矛盾します。継承することはできませんが、Finalizeメソッドは、継承チェーンのすべてのインスタンスに対して、最も派生したものから最も派生していないものへと再帰的に呼び出される」ので、少し混乱しています。それはだと注意ではないあなたがが、継承デストラクタから得るだろうと同じ動作が。
Mark Amery 2017年

@MarkAmeryああ、そうですね、基本的に継承されたものとは逆の順序で呼び出されますか?
RononDex 2017年

45

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

  • あなたは、アンマネージリソース(例えば経由への直接アクセスを持っているIntPtr)、あなたは使用することはできませんSafeHandle、それが容易になりますました
  • あなたはIDisposable封印されていないクラスで実装しています。(私の好みは、継承のために設計されていない限り、クラスをシールすることです。)そのような場合、ファイナライザは、正規のDisposeパターンの一部です。

9

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


12
あなたが読んだC#仕様に応じて、どちらも正しいです。最新のMSの1つ(統合C#3.0)はそれらをデストラクタ(たとえば、セクション10.13)と呼んでいますが、ECMA仕様はファイナライザと呼んでいます。
Jon Skeet、

@ 1800INFORMATION:構文要素は適切にデストラクタと呼ばれます。クラスにデストラクタがある場合、C#コンパイラはtry/finally、親Finalizeメソッドが確実に呼び出されるようにする、一般的に使用されないブロックを含むファイナライザを自動生成します。デストラクタに当てはまることのほとんどはファイナライザにも当てはまりますが、逆も同様ですが、単語の意味は少し異なります。
スーパーキャット2014年

4

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.