C# 2-2 プロパティについて

C#のプロパティは、オブジェクト指向の重要な原則である「カプセル化(データの保護)」を、誰でも簡単に、かつ美しく書けるようにした機能

1. なぜ「フィールド」を直接公開してはいけないのか?

クラス内の変数(フィールド)を public にして直接公開すると、外部から自由に値を書き換えられてしまいます。

C#

public class Player {
    public int Hp; // フィールドを公開
}

// 外部から、HPをマイナス1万にできてしまう(不正な状態)
var p = new Player();
p.Hp = -10000; 

これを防ぐために、かつてのプログラミング(Javaなど)では「Getメソッド」と「Setメソッド」を自作していました。C#のプロパティは、この「メソッドを通した読み書き」を、まるで変数のように扱えるようにした仕組みです。


2. プロパティの「3つの形態」

C#の進化とともに、プロパティの書き方はより便利になってきました。

① 基本形(フルプロパティ)

値のチェック(バリデーション)など、独自の処理を入れたい場合に使います。 背後でデータを保持する変数(_age)を「バッキングフィールド」と呼びます。

C#

private int _age;

public int Age {
    get { return _age; }
    set {
        // valueは、代入しようとしている値が入る予約語
        if (value < 0) throw new ArgumentException("年齢は0以上です");
        _age = value;
    }
}

② 自動実装プロパティ

特にロジックが必要ない場合、C#が裏側で自動的にフィールドを作ってくれる書き方です。現在のC#開発で最も多用されます。

C#

// これだけで内部に隠しフィールドが作られ、安全に公開される
public string Name { get; set; }

③ 式形式のプロパティ (Expression-bodied members)

計算結果などを返すだけのプロパティを、より短く書く方法です(C# 6.0〜)。

C#

public int Width { get; set; }
public int Height { get; set; }

// 面積を計算して返す読み取り専用プロパティ
public int Area => Width * Height; 

3. アクセス権限のコントロール

プロパティの最大の利点は、**「読み取りは誰でもOK、書き込みは自分だけ」**といった細かい制御ができる点です。

C#

public class User
{
    // 外部からは値を見ることしかできない(読み取り専用)
    public int Id { get; private set; }

    // 初期化時(コンストラクタ)だけ設定可能
    public string CreatedAt { get; init; }

    public User(int id)
    {
        Id = id; // クラス内部なのでセット可能
    }
}
  • get; private set;: クラスの外からは読み取れるが、変更はクラス内のメソッドからしかできない。
  • get; init;: オブジェクトを作る瞬間(初期化時)だけ値を入れられる。それ以降は変更不可。

4. なぜ「プロパティ」を使い分ける必要があるのか?

実務でフィールドではなくプロパティを使うべき理由は、単なる安全策だけではありません。

  1. デバッグのしやすさ: set の中にブレークポイントを置けば、「いつ、誰が値を書き換えたか」が即座にわかります。
  2. インターフェースとの親和性: インターフェース(設計図)にはフィールドは定義できませんが、プロパティは定義できます。
  3. データバインディング: WPFなどのGUI開発では、画面上の表示とデータを連動させるためにプロパティが必須となります。

まとめ:初心者がまず覚えること

まずは 「基本は自動実装プロパティ ({ get; set; }) を使い、特別なルール(0以下はダメなど)が必要になった時だけフルプロパティに書き換える」 という方針で進めれば間違いありません。

次は、このプロパティを使って「コンストラクタでデータを初期化する方法」について詳しく見ていきましょう.