クラスの「コンストラクタ」とは
C#の「クラス(class)」は、オブジェクト(モノ)を作るための「設計図」です。この設計図からnewキーワードを使って実際の「オブジェクト(インスタンス)」を生成する際、そのオブジェクトが使用可能な状態になるように初期化を行うための特別なメソッドが呼び出されます。
この「インスタンス生成時に必ず1回だけ呼び出される、初期化専用のメソッド」のことを「コンストラクタ(Constructor)」と呼びます。
コンストラクタの主な役割は、オブジェクトが持つデータ(フィールドやプロパティ)に、必須の初期値を設定することです。
コンストラクタの基本構文
コンストラクタには、通常のメソッドとは異なる、以下の厳格なルールがあります。
- メソッド名が、クラス名と完全に同じである必要があります。
- 戻り値の型(
voidやintなど)を持ちません(記述しません)。 - 通常、外部(
new)から呼び出せるようにpublicアクセス修飾子を付けます。
コード例:コンストラクタの定義と使用
Product(商品)クラスを例に、コンストラクタの定義と呼び出し方を見ていきます。
Product クラスの定義
このクラスは、Sku(商品コード)とName(商品名)という、一度設定されたら変更できない「読み取り専用プロパティ({ get; })」を持つとします。
{ get; }のみのプロパティは、宣言時かコンストラクタ内部でしか値を設定できません。
using System;
using System.Globalization;
/// <summary>
/// 商品を表すクラス
/// </summary>
public class Product
{
// 1. 読み取り専用プロパティ (get-only)
// コンストラクタで値が設定された後、変更は不可。
public string Sku { get; }
public string Name { get; }
// 2. 読み書き可能なプロパティ
public decimal Price { get; set; }
// 3. コンストラクタ (Constructor)
// ・クラス名 (Product) と同じ名前
// ・戻り値 (void など) がない
// ・'new Product(...)' で呼び出される
public Product(string sku, string name)
{
// 'new' 時に渡された引数を、プロパティに設定する(初期化)
this.Sku = sku;
this.Name = name;
// Price はコンストラクタで設定しなくてもよい
// (デフォルト値 0m で初期化される)
}
}
コンストラクタの呼び出し
new Product("SKU-A101", "Premium Keyboard") のようにnewキーワードでクラスを呼び出すと、C#コンパイラは引数の型(string, string)に一致するコンストラクタ(上記のProduct(string sku, string name))を探し出して実行します。
using System;
using System.Globalization;
/// <summary>
/// プログラム実行クラス
/// </summary>
public class Program
{
public static void Main()
{
// 日本円 (N0: 桁区切り) の書式設定
CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
// 1. 'new' キーワードで Product クラスのコンストラクタを呼び出す
// 引数 ("SKU-A101", "Premium Keyboard") がコンストラクタに渡される
var item1 = new Product("SKU-A101", "Premium Keyboard");
// 2. コンストラクタによってプロパティが初期化されているか確認
Console.WriteLine($"--- 商品1 ---");
Console.WriteLine($"SKU: {item1.Sku}");
Console.WriteLine($"名前: {item1.Name}");
// 3. 読み書き可能なプロパティは後から設定できる
item1.Price = 12000m;
Console.WriteLine($"価格: {item1.Price:N0}円");
// 4. 読み取り専用プロパティは変更しようとするとコンパイルエラー
// item1.Sku = "SKU-A102"; // コンパイルエラー!
}
}
出力結果:
--- 商品1 ---
SKU: SKU-A101
名前: Premium Keyboard
価格: 12,000円
補足:デフォルトコンストラクタ(引数なし)
もし、クラスにコンストラクタを1つも定義しなかった場合、C#コンパイラは引数を持たない「デフォルトコンストラクタ」を自動的に生成します。
public class SimpleLogger
{
// コンストラクタを何も定義しない
}
// 呼び出し側
var logger = new SimpleLogger(); // 自動生成されたデフォルトコンストラクタが呼ばれる
非常に重要な注意点として、Productクラスの例のように、引数を持つコンストラクタを1つでも定義すると、この「デフォルトコンストラクタ」は自動生成されなくなります。
もし、new Product("SKU", "Name") と new Product() の両方の呼び出し方を許可したい場合は、引数なしのコンストラクタも明示的に定義(オーバーロード)する必要があります。
public class Product
{
public string Sku { get; }
public string Name { get; }
// 引数ありコンストラクタ
public Product(string sku, string name)
{
this.Sku = sku;
this.Name = name;
}
// 引数なしコンストラクタ (明示的に定義)
public Product()
{
this.Sku = "DEFAULT-000";
this.Name = "Untitled";
}
}
まとめ
コンストラクタは、クラス(設計図)からオブジェクト(実体)を生成するnewの瞬間に呼び出され、オブジェクトを正しく使えるように初期化する役割を担います。
特に、{ get; }(読み取り専用)プロパティに値を設定する主要な手段であり、クラスが有効な状態(必須のデータが設定された状態)で生成されることを保証するために不可欠な機能です。
