.NET開発者のためのブログメディア

C#のデストラクタ(ファイナライザー)を使ってできること
2020年02月18日
C#を勉強していると、リソースの破棄絡みで「デストラクタ」という言葉を聞く機会があるかと思います。本記事では、デストラクタ(ファイナライザー)の概要や使い方を解説しています。ぜひ、参考にしてみてください。
- PG
- コンストラクタなら聞いたことがありますが、デストラクタとは何でしょうか……?
- PM
- デストラクタはC#でメモリの管理を行う際に使うメソッドですね。注意点もあるので、ここで使い方を覚えておきましょう!
目次
C#のデストラクタとは
はじめに、デストラクタについて知識を入れておきましょう。デストラクタ(ファイナライザ)とは、ガベージコレクターによってインスタンスが破棄されるときに呼び出されるメソッドです。
【知識】
ガベージコレクター…プログラムが動的に確保したメモリ領域を解放する機能「ガベージコレクション」を行うもの。
ガベージコレクター…プログラムが動的に確保したメモリ領域を解放する機能「ガベージコレクション」を行うもの。
そして、以下のような特徴があります。
- ・クラスでのみ使用できる(構造体では不可)
- ・1つのクラスにつき1つのデストラクタ
- ・いつ実行されるかは指定できない
とはいえ、あまりピンと来ないと思いますので、さっそく次項でサンプルプログラムを紹介します。
デストラクタの使用例
ここでは、実際にデストラクタを使用し、その役割について解説していきたいと思います。デストラクタは以下のように、クラス名の前に「~」を付けて定義します。
1 2 3 4 5 6 7 |
class SampleClass { ~SampleClass() // デストラクタ { // 処理 } } |
では、デストラクタを呼んでみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; namespace FinalizeSample { class Finalizer { static void Main() { Console.WriteLine("1"); // コンストラクタの呼び出し Program program = new Program(); Console.WriteLine("2"); // programインスタンスは利用されなくなる program = null; Console.WriteLine("3"); Console.WriteLine("4"); Console.WriteLine("5"); Console.ReadLine(); } } class Program { // コンストラクタの定義 public Program() { Console.WriteLine("コンストラクタが呼ばれたよ"); } ~Program() { Console.WriteLine("デストラクタが呼ばれたよ"); } } } |
そして、こちらが実行結果です。
- PG
- あれ、デストラクタが呼ばれていませんね……。
- PM
- 先ほど説明したとおり、デストラクタは「いつ呼び出されるか分からない」という特徴があります。アンマネージリソースで使用するのは控えるようにしましょう。
デストラクタは確実にインスタンスを破棄してくれるメソッド
今回はデストラクタの概要から使い方までを解説していきました。デストラクタは確実にインスタンスを破棄してくれるメソッドです。しかし、「いつ実行されるか分からない」というデメリットもあるため、Disposeメソッドを呼び出すusingと一緒に使用するようにしてください。