C#のコンストラクタとデストラクタ:オブジェクトの誕生と終焉を管理する仕組み
C#におけるオブジェクト指向プログラミングの基本として、「コンストラクタ(Constructor)」と「デストラクタ(Destructor)」の役割は欠かせません。この記事では、それぞれの役割と使い方、注意点について具体例とともに解説します。
1. コンストラクタとは?
● 目的:オブジェクト生成時の初期化処理
コンストラクタは、クラスからインスタンスを生成したときに自動的に呼ばれる特殊なメソッドです。主に、フィールドの初期値を設定したり、生成時に必要な処理を行うために使います。
● 基本構文
class Player
{
public string Name;
public int HP;
// コンストラクタ
public Player(string name, int hp)
{
Name = name;
HP = hp;
}
}
Player p = new Player("勇者", 100); // ここで自動的にコンストラクタが実行される
● 補足ポイント
- コンストラクタ名はクラス名と同じ
- 戻り値は書かない(void も付けない)
- オーバーロード可能(引数違いで複数定義できる)
public Player(string name) : this(name, 50) { } // HPを50で固定するバージョン
2. デストラクタとは?
● 目的:オブジェクト破棄時の後始末
デストラクタは、C#でオブジェクトがガベージコレクション(GC)により破棄される直前に実行される特殊なメソッドです。C++とは異なり、C#では明示的に破棄することが少ないため、使われる機会は限られます。
● 基本構文
class Sample
{
~Sample()
{
Console.WriteLine("Sampleオブジェクトが破棄されました");
}
}
● 注意点
- ~クラス名() という形で定義する
- 引数は取れない
- ガベージコレクタのタイミングは 非同期で予測できない
- 明示的なリソース管理には IDisposable パターンが推奨される
class FileHandler : IDisposable
{
private StreamReader reader;
public FileHandler(string path)
{
reader = new StreamReader(path);
}
public void Dispose()
{
reader?.Dispose();
Console.WriteLine("明示的にリソースを解放しました");
}
}
3. コンストラクタとデストラクタのまとめ
機能 | 呼び出されるタイミング | 主な用途 | 特徴 |
---|---|---|---|
コンストラクタ | new でインスタンス生成時 | 初期化処理 | 戻り値なし、オーバーロード可能 |
デストラクタ | ガベージコレクションで破棄される直前 | リソースの後始末 | タイミングは不定、~クラス名() |
4. 補足:分解代入用の Deconstruct メソッド
C# 7.0 以降では、以下のようにオブジェクトを複数の変数に分解代入(tuple-like)できる構文がありますが、これは「デストラクタ」ではなく、Deconstruct という普通のメソッドによって実現されています。
class Player
{
public string Name;
public int HP;
public Player(string name, int hp)
{
Name = name;
HP = hp;
}
public void Deconstruct(out string name, out int hp)
{
name = Name;
hp = HP;
}
}
// 使用例
var player = new Player("魔法使い", 80);
(var name, var hp) = player;
Console.WriteLine($"{name} のHPは {hp}");
- ✅ Deconstruct はただのメソッド
まとめ
C#では、コンストラクタ=「生まれた瞬間に呼ばれる」、デストラクタ=「消えるときに呼ばれる」と覚えると理解しやすいです。
さらに、Deconstructメソッドはタプルのように分解するための便利な仕組みであり、デストラクタとは別物である点に注意しましょう。
おわりに
プログラムの「誕生」と「終焉」をコントロールできる仕組みを理解することは、堅牢で効率的なコードを書く第一歩です。リソース管理や初期化処理を正しく設計できるようになると、より一段レベルアップしたC#プログラミングが可能になります。
ディスカッション
コメント一覧
まだ、コメントがありません