クラスとコンストラクタ
C#のクラス(class)は、オブジェクト指向プログラミングにおける「設計図」です。この設計図から実際の「モノ(インスタンス)」を生成する際、そのオブジェクトが最初から正しいデータ(名前やIDなど)を持っている状態にするために、初期化処理が必要になります。
このインスタンス生成時に自動的に呼び出される初期化メソッドのことを「コンストラクタ(Constructor)」と呼びます。
コンストラクタを適切に定義することで、必須データの欠落を防ぎ、堅牢なクラス設計を行うことができます。
コンストラクタの基本ルール
コンストラクタはメソッドの一種ですが、通常のメソッドとは異なる特別なルールがあります。
- メソッド名はクラス名と完全に同じでなければなりません。
- 戻り値の型(
voidやintなど)を記述しません。 - 通常、
newキーワードで外部から呼び出せるようにpublic修飾子を付けます。
定義の構文
public class クラス名
{
// コンストラクタ
public クラス名(引数リスト)
{
// 初期化処理
}
}
コード例:コンストラクタによる初期化
ここでは、書籍を表すBookクラスを例に解説します。書籍には「タイトル」と「著者」が必須であり、これらは一度設定されたら変更されない(読み取り専用)とします。
コンストラクタを使用することで、これらの必須項目が設定されないままオブジェクトが作られるのを防ぐことができます。
using System;
/// <summary>
/// 書籍を表すクラス
/// </summary>
public class Book
{
// 1. 読み取り専用プロパティ (Get-only Property)
// コンストラクタでのみ値を設定可能。その後は変更不可。
public string Title { get; }
public string Author { get; }
// 2. 読み書き可能なプロパティ
public decimal Price { get; set; }
// 3. コンストラクタ (Constructor)
// クラス名 (Book) と同じ名前で定義する
public Book(string title, string author)
{
// 引数で受け取った値をプロパティに設定(初期化)
// 'this' は「このインスタンス自身の」という意味
this.Title = title;
this.Author = author;
// Price は必須ではないため、ここでは初期化しない(デフォルト 0m になる)
// 必要であれば this.Price = ... と設定してもよい
}
}
コンストラクタの呼び出し(インスタンス化)
定義したコンストラクタは、newキーワードを使ってクラスをインスタンス化する際に呼び出されます。引数の型と順序は、定義と一致している必要があります。
using System;
public class ConstructorExample
{
public static void Main()
{
// 1. 'new' でコンストラクタを呼び出す
// 必須のタイトルと著者を渡す
var myBook = new Book("C# Programming Guide", "John Doe");
// 2. プロパティが正しく初期化されているか確認
Console.WriteLine($"タイトル: {myBook.Title}");
Console.WriteLine($"著者: {myBook.Author}");
// 3. 読み書き可能なプロパティは後から設定可能
myBook.Price = 3500m;
Console.WriteLine($"価格: {myBook.Price:N0}円");
// 4. 読み取り専用プロパティへの代入はコンパイルエラーになる
// myBook.Title = "Java Guide"; // エラー!
}
}
出力結果:
タイトル: C# Programming Guide
著者: John Doe
価格: 3,500円
コンストラクタのオーバーロード
メソッドと同様に、コンストラクタも「オーバーロード(多重定義)」が可能です。これにより、引数の異なる複数の初期化パターンを提供できます。
例えば、「著者名が不明な場合」に対応するコンストラクタを追加できます。
public class Book
{
public string Title { get; }
public string Author { get; }
// パターン1: タイトルと著者を指定
public Book(string title, string author)
{
this.Title = title;
this.Author = author;
}
// パターン2: タイトルのみ指定(著者は "Unknown" とする)
public Book(string title)
{
this.Title = title;
this.Author = "Unknown";
}
}
呼び出し側は、状況に応じて使い分けることができます。
C#
var book1 = new Book("Design Patterns", "Gang of Four");
var book2 = new Book("Mystery Novel"); // 著者は "Unknown" になる
まとめ
コンストラクタは、クラスを利用可能な状態にするための「初期化」を担当する重要なメソッドです。
- クラス名と同じ名前で定義し、戻り値は持ちません。
newキーワードでのインスタンス生成時に必ず実行されます。- 特に
{ get; }(読み取り専用)プロパティに値を設定する場所として重要であり、オブジェクトの**不変性(Immutability)**を保つための要となります。
