C# 2-3 プロパティとセットで語られることが多い「コンストラクタ」

プロパティとセットで語られることが多い「コンストラクタ」と、実際にどう使い分けるのかという「実務的な構成」について、さらに深掘りして解説します。

1. プロパティとコンストラクタの連携

プロパティは「データの入れ物」ですが、オブジェクトを作った瞬間に「正しいデータ」が入っている状態にするのがコンストラクタの役割です。

具体的なコード例

例えば、銀行口座(BankAccount)クラスを考えてみましょう。口座番号は後から変えられては困りますし、残高はマイナス(借金設定でない限り)を禁止したいはずです。

C#

public class BankAccount
{
    // 1. プロパティの定義
    // 口座番号:読み取り専用(書き換え不可)
    public string AccountNumber { get; } 
    
    // 残高:クラス内からのみ変更可能
    private decimal _balance;
    public decimal Balance 
    {
        get => _balance;
        private set 
        {
            if (value < 0) throw new ArgumentException("残高不足です");
            _balance = value;
        }
    }

    // 2. コンストラクタ:作成時に強制的に値をセットする
    public BankAccount(string accountNumber, decimal initialBalance)
    {
        AccountNumber = accountNumber;
        Balance = initialBalance; // プロパティのsetを介してチェックが走る
    }

    // 3. メソッド:業務ロジック
    public void Deposit(decimal amount)
    {
        Balance += amount; // 内部で安全に加算
    }
}

2. 自動実装プロパティの「進化」

C#のバージョンが上がるにつれ、プロパティはより短く、安全に書けるようになっています。

init 専用セッター (C# 9.0〜)

「作成時だけ値を設定したいが、コンストラクタを何個も書くのは面倒」という場合に便利です。

C#

public class Product
{
    public int Id { get; init; } // initにすると作成後、変更不可になる
    public string Name { get; set; }
}

// 使い方(オブジェクト初期化子)
var p = new Product { Id = 1, Name = "Coffee" };
// p.Id = 2; // これはコンパイルエラーになるので安全!

3. 「プロパティ」vs「メソッド」の使い分け

初心者がよく迷うのが、**「値を返すだけなら、メソッドでも良くない?」**という点です。Microsoftの設計ガイドラインでは以下のように推奨されています。

特徴プロパティ(Property)メソッド(Method)
実行速度一瞬で終わるべき(値を返すだけ)時間がかかる処理でもOK
副作用読み取りで状態が変わらないこと実行によって状態が変わってもOK
直感「データ(名詞)」を取得する感覚「動作(動詞)」を実行する感覚

悪い例:

public int UserCount => Database.FetchCount();

(プロパティなのに裏で重いデータベース接続が発生するのは、使う側が予期せぬパフォーマンス低下を招くためNGです。)


4. なぜプロパティが「必須」と言われるのか

C#で本格的なアプリ(デスクトップ、Web、スマホアプリ)を作るとき、「データバインディング」という技術を必ず使います。

これは、「C#側のプロパティの値が変わったら、画面上のテキストボックスの表示も自動で書き換わる」という仕組みです。この仕組みは「プロパティ」に対してのみ動作するように作られていることが多いため、フィールドではなくプロパティを使うことがC#界の「鉄則」となっています。


次に学ぶべきステップ

プロパティを使って「クラスの守り」を固める方法が分かったら、次は「リスト(List<T>)を使って、複数のオブジェクトを管理する方法」を学ぶと、一気に作れるアプリの幅が広がります。