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. なぜ「プロパティ」を使い分ける必要があるのか?
実務でフィールドではなくプロパティを使うべき理由は、単なる安全策だけではありません。
- デバッグのしやすさ:
setの中にブレークポイントを置けば、「いつ、誰が値を書き換えたか」が即座にわかります。 - インターフェースとの親和性: インターフェース(設計図)にはフィールドは定義できませんが、プロパティは定義できます。
- データバインディング: WPFなどのGUI開発では、画面上の表示とデータを連動させるためにプロパティが必須となります。
まとめ:初心者がまず覚えること
まずは 「基本は自動実装プロパティ ({ get; set; }) を使い、特別なルール(0以下はダメなど)が必要になった時だけフルプロパティに書き換える」 という方針で進めれば間違いありません。
次は、このプロパティを使って「コンストラクタでデータを初期化する方法」について詳しく見ていきましょう.

