例えば:
public class Person
{
public Person()
{
}
~Person()
{
}
}
デストラクタを手動で作成する必要があるのはいつですか? デストラクタを作成する必要があったのはいつですか?
ベストアンサー1
更新:この質問は2015年5月の私のブログのテーマ素晴らしい質問をありがとうございます。ファイナライズに関して一般的に信じられている誤った情報の長いリストについては、ブログをご覧ください。
デストラクタを手動で作成する必要があるのはいつですか?
ほとんどは決してない。
通常、クラスがオブジェクトがなくなるときにクリーンアップする必要がある高価なアンマネージ リソースを保持している場合にのみ、デストラクタを作成します。リソースがクリーンアップされるようにするには、破棄可能なパターンを使用することをお勧めします。デストラクタは、基本的に、オブジェクトのコンシューマーがオブジェクトの破棄を忘れた場合でも、リソースが最終的にクリーンアップされることを保証します。(おそらく)
デストラクタを作成する場合細心の注意を払ってくださいそしてガベージコレクターの仕組みを理解するデストラクタは本当に奇妙:
- これらはあなたのスレッド上で実行されるのではなく、独自のスレッド上で実行されます。デッドロックは発生しません。
- デストラクタからスローされた未処理の例外は悪い知らせです。それは独自のスレッド上にあるので、誰がそれをキャッチするのでしょうか?
- オブジェクトに対してデストラクタが呼び出されることがある後コンストラクタは起動しますが前にコンストラクタが終了します。適切に記述されたデストラクタは、コンストラクタで確立された不変条件に依存しません。
- デストラクタはオブジェクトを「復活」させ、死んだオブジェクトを再び生き返らせることができます。これは本当に奇妙なことです。そうしないでください。
- デストラクタは実行されない可能性があり、オブジェクトがファイナライズされる予定になっているかどうかはわかりません。おそらくそうなるでしょうが、それは保証ではありません。
通常真であるものはほとんど、デストラクタでは真ではありません。本当に注意してください。正しいデストラクタを書くのは非常に困難です。
デストラクタを作成する必要があったのはいつですか?
デストラクタを処理するコンパイラの部分をテストする場合。製品コードではこれを行う必要はありませんでした。管理されていないリソースを操作するオブジェクトを作成することはほとんどありません。