プロパティとセットで語られることが多い「コンストラクタ」と、実際にどう使い分けるのかという「実務的な構成」について、さらに深掘りして解説します。
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>)を使って、複数のオブジェクトを管理する方法」を学ぶと、一気に作れるアプリの幅が広がります。

