プロパティの初期値設定
C#のクラス設計において、プロパティ({ get; set; })がnewでインスタンス化された時点で、nullや0といった型のデフォルト値ではなく、特定の「初期値」を持っていてほしい場合があります。
従来、この初期値の設定は、主にコンストラクタの内部で行われていました。
// 従来のコンストラクタによる初期化
public class TaskItem
{
public string Title { get; set; }
public bool IsCompleted { get; set; }
// コンストラクタで初期値を代入
public TaskItem()
{
this.Title = "(タイトル未設定)";
this.IsCompleted = false;
}
}
この方法は確実ですが、プロパティが増えるたびにコンストラクタの記述が長くなり、どのプロパティがどの値で初期化されるのかが分散しがちでした。
C# 6.0以降、**自動実装プロパティ(Auto-Implemented Property)**の宣言と同時に、その初期値をインラインで設定できるようになりました。
プロパティ初期化子(Property Initializer)
自動実装プロパティの宣言の末尾に = 演算子を使って値を指定することで、そのプロパティの初期値を設定できます。これを「プロパティ初期化子」と呼びます。
構文: public T MyProperty { get; set; } = [初期値];
この構文を使用すると、コンパイラが自動的にこの初期化コードを実行してくれるため、コンストラクタの記述を大幅に省略できます。
コード例:プロパティ初期化子の使用
TaskItem(タスク項目)クラスを例に、string、bool、int、DateTime型の各プロパティに初期値を設定します。
using System;
/// <summary>
/// タスク項目を表すクラス
/// </summary>
public class TaskItem
{
// 1. string型プロパティの初期化
// (null ではなく、空文字列またはデフォルト文字列にする)
public string Title { get; set; } = "(タイトル未設定)";
// 2. bool型プロパティの初期化 (デフォルトは false だが明示)
public bool IsCompleted { get; set; } = false;
// 3. int型プロパティの初期化
public int Priority { get; set; } = 1; // デフォルトの優先度
// 4. 読み取り専用プロパティ ({ get; }) の初期化
// コンストラクタでのみ設定可能なプロパティも初期化できる
public DateTime CreatedAt { get; } = DateTime.UtcNow;
}
実行例と動作確認
上記のクラスをnewでインスタンス化すると、コンストラクタを呼び出していないにもかかわらず、各プロパティが宣言時に指定した初期値で設定されていることが確認できます。
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("--- 新しいタスクを生成(デフォルト値) ---");
// コンストラクタ引数なしでインスタンス化
var newTask = new TaskItem();
// 各プロパティに初期値が設定されているか確認
Console.WriteLine($"タイトル: {newTask.Title}");
Console.WriteLine($"完了状態: {newTask.IsCompleted}");
Console.WriteLine($"優先度: {newTask.Priority}");
Console.WriteLine($"作成日時 (UTC): {newTask.CreatedAt:O}");
// プロパティはもちろん変更可能 (読み取り専用の CreatedAt を除く)
newTask.Title = "データベースのバックアップ";
newTask.Priority = 3;
Console.WriteLine("\n--- 値を変更後 ---");
Console.WriteLine($"タイトル: {newTask.Title}");
Console.WriteLine($"優先度: {newTask.Priority}");
}
}
出力結果(作成日時は実行時に依存):
--- 新しいタスクを生成(デフォルト値) ---
タイトル: (タイトル未設定)
完了状態: False
優先度: 1
作成日時 (UTC): 2025-11-15T05:34:21.1234567Z
--- 値を変更後 ---
タイトル: データベースのバックアップ
優先度: 3
読み取り専用プロパティと初期化子
この機能が特に強力なのは、{ get; }構文で定義された「読み取り専用プロパティ」にも適用できる点です。
public DateTime CreatedAt { get; } = DateTime.UtcNow;
このプロパティは、コンストラクタが実行される(インスタンスが生成される)タイミングでDateTime.UtcNowの値で初期化され、その後は変更が禁止されます。これにより、不変(Immutable)なプロパティの初期値も、コンストラクタを記述せずに設定できます。
まとめ
自動実装プロパティの初期化子(= [初期値];)は、C#におけるクラス設計を簡潔にするための重要な機能です。
- コンストラクタでの冗長な初期化コードを削減できます。
- プロパティの宣言と同時に初期値が定義されるため、クラスの「デフォルト状態」の可読性が向上します。
getのみの読み取り専用プロパティに対しても使用でき、不変なプロパティの初期化にも役立ちます。
