C#でクラスを設計する際に必ず出てくるのが、プロパティの「get」と「set」です。初心者のうちは「なんとなく使っている」ことが多いこの仕組みですが、実はオブジェクト指向プログラミングの中核ともいえる重要な概念です。この記事では、getとsetの役割や使い方を丁寧に解説し、さらに応用的な使い方まで紹介します。これを読めば、「getとsetの違いがわからない…」という悩みから卒業できるはずです。
C#のプロパティとは?
C#では、フィールド(変数)に直接アクセスさせずに、プロパティを使ってアクセス制御を行います。プロパティは、getとsetのアクセサを使って値の読み書きを定義します。
public class Person
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}
このように、Nameプロパティを通じてnameというフィールドを外部から制御することができます。
getとsetの基本的な役割
- getアクセサは、フィールドの値を取得するために使用されます。
- setアクセサは、フィールドの値を設定するために使用されます。
この2つを組み合わせることで、安全にクラスのデータを扱えるようになります。
Person p = new Person();
p.Name = "Taro";    // setが呼ばれる
Console.WriteLine(p.Name);  // getが呼ばれる
自動実装プロパティでコードを簡潔に
C#では、フィールドの定義とget/setの実装を簡略化するために、「自動実装プロパティ」を使用できます。
public class Person
{
    public string Name { get; set; }
}
このように書くだけで、内部でフィールドが自動的に作成され、get/setが機能します。初学者には特に扱いやすい構文です。
setだけ、getだけのプロパティ
時には、値の「読み取り専用」や「書き込み専用」にしたい場合もあります。そんなときは、getまたはsetのみを実装することができます。
読み取り専用(getのみ)
public class Circle
{
    public double Radius { get; set; }
    public double Area
    {
        get { return Math.PI * Radius * Radius; }
    }
}
書き込み専用(setのみ)
private string password;
public string Password
{
    set { password = value; } // getなし
}
アクセス修飾子を使って制御する
プロパティのgetやsetには、個別にアクセス修飾子を設定することも可能です。
public class Account
{
    public int Balance { get; private set; }
    public void Deposit(int amount)
    {
        if (amount > 0)
        {
            Balance += amount;
        }
    }
}
このようにすれば、Balanceは外部から読み取ることはできるが、書き換えることはできません(内部では書き換え可)。
バリデーションを加える:setの応用
setアクセサでは、入力値をチェックすることが可能です。
private int age;
public int Age
{
    get { return age; }
    set
    {
        if (value >= 0 && value <= 120)
        {
            age = value;
        }
        else
        {
            throw new ArgumentOutOfRangeException("Age must be between 0 and 120.");
        }
    }
}
このように、値の整合性を保つことができるのが、プロパティの大きなメリットです。
initアクセサとは(C# 9.0以降)
C# 9.0からは、setの代わりにinitを使えるようになりました。これは「初期化時のみ設定可能」となる新しい書き方です。
public class Book
{
    public string Title { get; init; }
}
このプロパティは、次のようにオブジェクト初期化子を使ってだけ設定可能です。
csharpコピーする編集するvar book = new Book { Title = "C#入門" };
initを使うことで、不変(immutable)なオブジェクトをより簡単に作成できます。
getとsetを使いこなすためのポイント
- 基本は自動実装プロパティでOK
- 複雑なロジックが必要なら、手動でget/setを記述
- アクセス制限(private setなど)を活用
- initでイミュータブルな設計も取り入れる
- getと- setでデータの入口と出口をコントロールする設計力が重要
まとめ
C#におけるgetとsetは、単なる読み書きの手段ではなく、クラス設計における情報のカプセル化・アクセス制御の要です。自動実装で簡潔に書くこともできれば、柔軟にカスタマイズして高機能なプロパティも作成できます。この記事を参考に、あなたもプロパティを自在に操れるC#プログラマーを目指してください。

