例えば:
public class Person
{
public Person()
{
}
~Person()
{
}
}
いつデストラクタを手動で作成する必要がありますか?デストラクタを作成する必要があるのはいつですか?
例えば:
public class Person
{
public Person()
{
}
~Person()
{
}
}
いつデストラクタを手動で作成する必要がありますか?デストラクタを作成する必要があるのはいつですか?
回答:
更新:この質問は、2015年5月の私のブログの主題でした。すばらしい質問をありがとう!人々がファイナライズについて一般的に信じている虚偽の長いリストについては、ブログを参照してください。
いつデストラクタを手動で作成する必要がありますか?
ほとんどは決してない。
通常、クラスがデストラクタを作成するのは、オブジェクトが削除されたときにクリーンアップする必要がある高価なアンマネージリソースをクラスが保持している場合のみです。リソースを確実にクリーンアップするには、使い捨てパターンを使用することをお勧めします。デストラクタは、本質的には、オブジェクトのコンシューマーが破棄を忘れた場合でも、リソースが最終的にクリーンアップされることを保証するものです。(多分。)
デストラクタを作成する場合は、非常に注意深く、ガベージコレクタの動作を理解してください。デストラクタは本当に奇妙です:
デストラクタでは、通常正しいことはほとんどありません。本当に、本当に注意してください。正しいデストラクタを作成することは非常に困難です。
デストラクタを作成する必要があるのはいつですか?
デストラクタを処理するコンパイラの部分をテストするとき。量産コードでこれを行う必要はありませんでした。アンマネージリソースを操作するオブジェクトを作成することはほとんどありません。
これは「ファイナライザ」と呼ばれ、通常、状態(つまり:フィールド)にアンマネージリソース(つまり、p / invoke呼び出しで取得されたハンドルへのポインタ)が含まれるクラスに対してのみ作成する必要があります。ただし、.NET 2.0以降では、実際にはアンマネージリソースのクリーンアップを処理するためのより良い方法があります。それはSafeHandleです。このため、ファイナライザを再度作成する必要はほとんどありません。
クラスがWindowsファイルハンドルなどのアンマネージリソースを維持している場合を除き、必要はありません。
これはデストラクタ/ファイナライザと呼ばれ、通常、Disposedパターンを実装するときに作成されます。
これは、クラスのユーザーがDisposeの呼び出しを忘れた場合のフォールバックソリューションであり、(最終的に)リソースが解放されることを確認しますが、デストラクターがいつ呼び出されるかについては保証されません。
このスタックオーバーフローの質問で、受け入れられた回答は、破棄パターンを実装する方法を正しく示しています。これは、ガベージコレクターが自分自身をクリーンアップするために管理できない、処理されないリソースがクラスに含まれている場合にのみ必要です。
ファイナライザを実装せずに、クラスのユーザーに手動でオブジェクトを破棄してリソースをすぐに解放できるようにすることをお勧めします。
デストラクタは、クラスにカプセル化されたアンマネージリソースを暗黙的に解放する方法を提供します。デストラクタは、GCがそれに到達すると呼び出され、基本クラスのFinalizeメソッドを暗黙的に呼び出します。アンマネージリソースを多数使用している場合は、IDisposableインターフェイスを介してそれらのリソースを解放する明示的な方法を提供することをお勧めします。C#プログラミングガイドを参照してください:http : //msdn.microsoft.com/en-us/library/66x5fx1b.aspx