#でオブジェクト指向プログラミングを学ぶうえで欠かせない概念のひとつが「コンストラクタ」です。クラスのインスタンスを作成するときに自動的に呼び出され、初期化処理などを行う重要な役割を担います。
本記事では、C#におけるコンストラクタの基本的な役割から、引数付きコンストラクタ、オーバーロード、コンストラクタのチェーン(thisキーワード)、さらには静的コンストラクタまで、幅広く解説します。初心者の方でも理解しやすいよう、サンプルコードとともに丁寧に説明します。
コンストラクタ(constructor)とは、クラスのインスタンスが生成されるときに自動的に呼び出される特別なメソッドのことです。
C#では、コンストラクタはクラス名と同じ名前を持ち、戻り値はありません。
class Person
{
public Person()
{
Console.WriteLine("Personのコンストラクタが呼ばれました");
}
}
このように、new Person()
とするだけで、自動的にコンストラクタが実行されます。
引数を持たないコンストラクタを「デフォルトコンストラクタ」と呼びます。クラス内で明示的に定義しなかった場合でも、自動的にデフォルトコンストラクタが用意されます。
class Animal
{
// 明示的に定義しなくてもデフォルトコンストラクタがある
}
ただし、引数付きコンストラクタを定義した場合、自動的なデフォルトコンストラクタは生成されないため、必要であれば自分で定義する必要があります。
class Animal
{
public Animal(string name) { }
// この場合、以下を明示的に定義しないとコンパイルエラーになる
public Animal() { }
}
コンストラクタに引数を持たせることで、オブジェクト生成時に値を渡して初期化することができます。
class Car
{
public string Brand { get; }
public Car(string brand)
{
Brand = brand;
}
}
// 使用例
var myCar = new Car("Toyota");
Console.WriteLine(myCar.Brand); // Toyota
このように、必要なデータをコンストラクタに渡すことで、より柔軟なクラス設計が可能になります。
C#ではメソッドと同様に、コンストラクタもオーバーロード(多重定義)することができます。
つまり、同じクラスに異なる引数の組み合わせのコンストラクタを複数定義できます。
class Book
{
public string Title { get; }
public int Pages { get; }
public Book()
{
Title = "未設定";
Pages = 0;
}
public Book(string title)
{
Title = title;
Pages = 0;
}
public Book(string title, int pages)
{
Title = title;
Pages = pages;
}
}
このように、状況に応じて適切なコンストラクタが呼び出されます。
複数のコンストラクタを持つクラスで、共通の初期化処理を一箇所にまとめたい場合は、this
キーワードを使って他のコンストラクタを呼び出すことができます。
class Laptop
{
public string OS { get; }
public int Memory { get; }
public Laptop() : this("Windows", 8)
{
}
public Laptop(string os) : this(os, 8)
{
}
public Laptop(string os, int memory)
{
OS = os;
Memory = memory;
}
}
this
による呼び出しは最初の行で行う必要があります。これにより、コードの重複を避けられ、メンテナンス性が向上します。
静的コンストラクタは、クラス全体で共通の初期化が必要なときに使用します。これは、インスタンスではなく、クラス自体が初めて使われたタイミングで一度だけ呼び出されます。
class Config
{
public static string AppName;
static Config()
{
AppName = "MyApplication";
Console.WriteLine("静的コンストラクタが実行されました");
}
}
静的コンストラクタは引数を取ることができず、アクセス修飾子も指定できません。
以下に、C#でコンストラクタを扱う際のポイントをまとめます。
C#のコンストラクタは、クラスのインスタンス化時に自動的に実行され、初期化処理を行う重要な仕組みです。デフォルトコンストラクタや引数付きコンストラクタ、オーバーロード、thisによるチェーン、静的コンストラクタなど、用途に応じて使い分けることで、より洗練されたクラス設計が可能になります。
プログラムの基本をしっかり固めたい方にとって、コンストラクタの理解は避けて通れないテーマです。この記事をきっかけに、C#のクラス設計にさらに自信を持てるようになっていただければ幸いです。