C#のクラス - デストラクター

C#のクラスにはデストラクター(ファイナライザー)と呼ばれる特殊なメソッドが存在します。
デストラクターはガベージコレクションによってクラスのインスタンスが破棄される時に呼び出されます。

インスタンスが破棄される直前で呼び出される為、そのインスタンスの後始末を行なう為に使われます。
後始末といってもメモリ開放はガベージコレクションで行われるので、アンマネージリソース(.Net Framework以外で管理されるリソース)の解放など特殊なケースでしか利用する事はないと思います。



デストラクターの定義

デストラクターは通常のメソッドとは以下の点で異なります。
  • 先頭に「~」を付け、クラス名と同じ名前で定義する
  • 戻り値は定義しない(戻り値はない)
  • パラメータは定義できない
  • アクセシビリティなどの修飾子は定義できない
  • 継承やオーバーロードは出来ない
  • ガベージコレクションによってのみ呼び出される(デストラクターを呼び出すコードは書けない)
  1. public class TestClass
  2. {
  3. ~TestClass() //デストラクター
  4. {
  5. //ココに後始末のコードを記述する
  6. }
  7. }


デストラクターの省略

デストラクターは省略する事が可能です。
必要ない場合は省略する方が良さそうです。(空のデストラクターは不必要にパフォーマンスを低下させてしまいます)
  1. public class TestClass
  2. {
  3. }



基底クラスのデストラクターは自動で呼び出される

継承されたクラスの場合、基底クラスをさかのぼってデストラクターが自動的に呼び出されます。
  1. public class TestClass1
  2. {
  3. ~TestClass1()
  4. {
  5. System.Diagnostics.Trace.WriteLine("TestClass1のデストラクター");
  6. }
  7. }
  8.  
  9. public class TestClass2 : TestClass1
  10. {
  11. ~TestClass2()
  12. {
  13. System.Diagnostics.Trace.WriteLine("TestClass2のデストラクター");
  14. }
  15. }
  16.  
  17. public class TestClass3 : TestClass3
  18. {
  19. ~TestClass3()
  20. {
  21. System.Diagnostics.Trace.WriteLine("TestClass3のデストラクター");
  22. }
  23. }
  24.  
  25. public class Program
  26. {
  27. public static Main()
  28. {
  29. TestClass3 c3 = new TestClass3();
  30. }
  31. }
  32. // 実行結果は以下のようになる
  33. //
  34. // TestClass3のデストラクター
  35. // TestClass2のデストラクター
  36. // TestClass1のデストラクター



明示的な解放手段の提供

デストラクターはガベージコレクションによって呼び出されます。
しかしガベージコレクションはいつ実行されるか分かりません。

リソースの解放は必要なくなった時点で行えるよう設計されるべきです。
リソースの解放が必要なクラスには、IDisposableインターフェイスを実装してDisposeメソッドでリソースの解放を行う事が推奨されています。

デストラクターはDisposeメソッドの呼び出しを忘れてしまったときの安全装置という位置づけになります。



コメント