C#のget/setとは?プロパティの書き方・使い方・フィールドとの違いを初心者向けに解説
はじめに
C#でコードを書いていると、get や set という言葉をよく見かけます。これはプロパティを扱うための大切な仕組みで、変数のように値を使いながら、必要に応じて値の取得や代入を制御できる便利な機能です。
特に初心者のうちは、「フィールドと何が違うのか」「get と set はどう書くのか」「自動実装プロパティは何が便利なのか」が分かりにくいポイントです。
この記事では、C# の get set の基本から、実際の書き方、フィールドとの違い、値のチェック方法、コンストラクタとの関係まで、初心者向けに分かりやすく解説します。
1. C#のget/setとは?まずはプロパティの基本を理解しよう
C# の get と set は、プロパティの中で使うアクセサです。
プロパティとは、クラスの外から値を安全に扱うための仕組みで、見た目は変数のように使えますが、中では値の取得や代入を制御できます。
たとえば、Age という値をそのまま外部から自由に変更させるのではなく、プロパティを通して確認や制限を入れられます。これが get set を使う大きな理由です。
1-1. getは値を取得するための仕組み
get は、プロパティの値を読み取るために使います。
外部から age のように値を参照したとき、その裏では get が実行され、内部の値を返します。
つまり get は「このプロパティの値をどう返すか」を決める部分です。
単純にフィールドの値を返すだけでなく、加工した値を返すこともできます。
1-2. setは値を代入・変更するための仕組み
set は、プロパティに値を代入するときに使います。
外部から Age = 20; のように書くと、その裏で set が呼ばれ、渡された値を受け取ります。
set の中では、不正な値を拒否したり、値を補正したりできます。
たとえば年齢にマイナス値を入れないようにする、といった制御が可能です。
1-3. get/setはプロパティで使うアクセサ
get と set は、単独で使うものではなく、プロパティの中に書きます。
プロパティはフィールドのように見えますが、実際にはメソッドのような処理を中に持てるため、柔軟に値を制御できます。
C# の get set は、単なる文法ではなく、オブジェクト指向で大切な「カプセル化」を実現するための仕組みでもあります。
1-4. 初心者がget/setでつまずきやすいポイント
初心者がつまずきやすいのは、get と set の役割を「変数の一種」だと誤解してしまうことです。
実際には、プロパティは値を持つだけでなく、値の取得・代入の処理を挟める特別な仕組みです。
また、set の中で使える value というキーワードの意味が分からず混乱することもあります。
このあと、実際のコードを見ながら順番に理解していきましょう。
2. C#のプロパティとは?フィールドとの違い
C# の get set を理解するには、まずフィールドとプロパティの違いを知ることが重要です。
どちらも値を扱いますが、役割はまったく同じではありません。
2-1. フィールドとはクラス内に値を保持する変数
フィールドは、クラスの中に直接値を保持するための変数です。
たとえば、name や age のように、オブジェクトの状態を保存するために使います。
C#class Person
{
public string name;
public int age;
}
このように書くと、name や age はフィールドです。
クラスの内部データをそのまま持っている、いわば実体そのものです。
2-2. プロパティとは外部から安全に値を扱う窓口
プロパティは、フィールドを外部から安全に扱うための窓口です。
外部からは変数のように見えますが、中で get や set を使って処理を入れられます。
C#class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
この例では、name はフィールド、Name はプロパティです。
外部から Name を通じて値を扱い、中では name を制御しています。
2-3. フィールドを直接公開しないほうがよい理由
フィールドを public で直接公開すると、どこからでも自由に値を変更できてしまいます。
すると、不正な値が入ったり、クラス内部のルールが壊れたりしやすくなります。
たとえば年齢に -100 を代入できてしまうと、データとして不自然です。
プロパティを使えば、そうした値を set の中で防げます。
2-4. フィールドとプロパティの使い分け
基本的には、クラス内部ではフィールドを使い、外部公開にはプロパティを使うのが一般的です。
フィールドはデータの保存用、プロパティは外部とのやり取り用、と考えると分かりやすいです。
つまり、直接触らせてよい単純なデータであっても、将来的に制御を追加する可能性があるなら、最初からプロパティで公開するほうが安全です。
3. C#のget/setの基本的な書き方
ここからは、C# の get set の具体的な書き方を見ていきます。
まずは通常のプロパティから理解すると、value の意味や実務での使い方が分かりやすくなります。
3-1. 基本構文:getとsetを使ったプロパティ定義
もっとも基本的なプロパティの構文は次の通りです。
C#class Person
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
このコードでは、Name プロパティを通じて name フィールドを読み書きできます。get は値を返し、set は値を受け取って保存します。
3-2. getでフィールドの値を返す書き方
get では、通常は内部フィールドの値をそのまま返します。
C#get
{
return name;
}
このように書くと、Name を読み取ったときに name の中身が返されます。
ただし、単純に返すだけでなく、表示用に加工して返すこともできます。
3-3. setでフィールドに値を代入する書き方
set は、代入された値をフィールドへ保存します。
C#set
{
name = value;
}
value は、プロパティに代入された値を表す特別なキーワードです。Name = "Taro"; と書くと、value に "Taro" が入ります。
3-4. valueキーワードの意味と使い方
value は set の中でだけ使える暗黙の引数です。
つまり、プロパティに代入された値そのものを受け取るための変数のようなものです。
C#set
{
if (value.Length > 20)
{
throw new ArgumentException("名前は20文字以内にしてください。");
}
name = value;
}
このように、value を使えば代入値をチェックしてから保存できます。get set の強みは、まさにこの「代入時の処理」を入れられる点にあります。
3-5. プロパティ名の命名ルール
C# のプロパティ名は、通常パスカルケースで書きます。
たとえば name ではなく Name、userAge ではなく UserAge のようにします。
一方、フィールドはキャメルケースや _name のような名前がよく使われます。
この区別をしておくと、コードを見たときに「これはプロパティ」「これは内部フィールド」と分かりやすくなります。
4. 自動実装プロパティの書き方と使い方
C# では、get set をもっと簡単に書ける「自動実装プロパティ」があります。
初心者が最初に覚えるべき便利な書き方のひとつです。
4-1. 自動実装プロパティとは
自動実装プロパティとは、内部フィールドを自分で書かなくてもよいプロパティです。
C# が裏側で必要なフィールドを自動的に用意してくれます。
4-2. { get; set; }の意味
次のように書くと、自動実装プロパティになります。
C#public string Name { get; set; }
これは「Name は読み書きできるプロパティです」という意味です。get; set; とセミコロンだけで書けるので、コードがかなり短くなります。
4-3. 自動実装プロパティを使うメリット
自動実装プロパティのメリットは、記述量が少なく、読みやすいことです。
単純に値を保持するだけなら、通常のプロパティよりずっと簡潔に書けます。
たとえば、DTO やデータクラスのように、処理を挟まず値を運ぶだけのクラスではとても便利です。
4-4. フィールドを省略できるケース
値のチェックや加工が必要ない場合は、自動実装プロパティだけで十分です。
内部に特別な処理がないなら、わざわざフィールドと get / set を分けて書く必要はありません。
C#public int Age { get; set; }
このように書けば、Age に値を設定したり取得したりできます。
内部の実装を意識せず、シンプルに扱えるのが魅力です。
4-5. 通常のプロパティとの違い
通常のプロパティは、get や set の中に処理を書けます。
一方、自動実装プロパティは処理を書かず、値の保存と取得だけを行います。
つまり、次のように考えると分かりやすいです。
単純な値の受け渡しなら自動実装プロパティ、値の検証や加工が必要なら通常のプロパティです。
5. get/setの使い方をサンプルコードで解説
ここでは、実際に get set を使ってクラスを作り、値を設定・取得する流れを確認します。
5-1. クラスにプロパティを定義する例
C#class Product
{
private int price;
public int Price
{
get
{
return price;
}
set
{
if (value < 0)
{
throw new ArgumentException("価格は0以上でなければなりません。");
}
price = value;
}
}
}
この Product クラスでは、Price プロパティを通して価格を管理しています。
マイナスの値が入った場合は例外を出し、不正なデータを防いでいます。
5-2. インスタンスからプロパティに値を設定する例
C#Product product = new Product();
product.Price = 1200;
このように書くと、set が呼ばれて 1200 が保存されます。
見た目はフィールドへの代入と似ていますが、裏では set の処理が動いています。
5-3. プロパティの値を取得して表示する例
C#Console.WriteLine(product.Price);
このコードでは、get が呼ばれて Price の値が返されます。
取得時には get の中の処理が実行されるため、必要に応じて加工済みの値も返せます。
5-4. get/setを使ったデータ管理の流れ
get set を使う流れはシンプルです。
外部から値を代入すると set が動き、内部のフィールドに保存されます。
外部から値を参照すると get が動き、保存された値を返します。
この仕組みにより、クラス内部の状態を守りながら、外部には使いやすい形で値を提供できます。
5-5. よくあるコンパイルエラーと修正方法
初心者がよく出会うのは、set の中で value を使わずに代入してしまうミスです。
C#set
{
price = price;
}
これは自分自身に代入しているだけで、正しく値が入りません。
正しくは次のように書きます。
C#set
{
price = value;
}
また、get を書いたのに return を忘れるとエラーになります。get は必ず値を返す必要があるため、return の書き忘れに注意しましょう。
6. get/setでアクセス制御を行う方法
get set の便利なところは、読み書きの権限を細かく分けられることです。
外部から自由に変更させたくない値は、set を制限することで安全性を高められます。
6-1. public get/setの意味
C#public string Name { get; set; }
このように書くと、外部からも読み取り・書き込みの両方ができます。
もっともシンプルで使いやすい形式ですが、何でも public get/set にすればよいわけではありません。
6-2. private setで外部からの変更を禁止する
C#public string Name { get; private set; }
この場合、外部からは Name を読み取れますが、変更はできません。
値の更新はクラス内部だけで行いたい場合に便利です。
たとえば、ID や作成日時のように、外から勝手に変えられると困る値に向いています。
6-3. getのみの読み取り専用プロパティ
C#public string Code { get; }
これは読み取り専用プロパティです。
初期化時やコンストラクタ内で設定し、それ以降は変更できません。
変更されたくない値を安全に扱えるため、Immutable な設計にも向いています。
6-4. setのみの書き込み専用プロパティは使うべきか
C# では書き込み専用のプロパティも作れますが、実際にはあまり使われません。
値を読む手段がないため、利用する側にとって分かりにくく、保守もしづらくなりやすいからです。
通常は get のある設計を優先し、必要な場合だけ例外的に考えるのがよいでしょう。
6-5. アクセス修飾子を使い分ける考え方
プロパティの公開範囲は、「どこから変更してよいか」で決めます。
自由に変更してよい値なら public get; set;、外部からは読むだけなら public get; private set; です。
この考え方を持つと、クラスの責任範囲が明確になり、予期しない変更を防ぎやすくなります。
7. get/setで値のチェックや加工を行う方法
get set の最大の利点は、値をただ保存するだけではなく、途中でチェックや加工を入れられることです。
これにより、データの整合性を保ちやすくなります。
7-1. set内で不正な値を防ぐ
C#private int age;
public int Age
{
get
{
return age;
}
set
{
if (value < 0)
{
throw new ArgumentException("年齢は0以上でなければなりません。");
}
age = value;
}
}
このように set の中で条件を確認すれば、不正な値の保存を防げます。
入力された値をそのまま受け入れるのではなく、ルールに従って制御するのが大切です。
7-2. get内で値を加工して返す
get の中では、保存している値をそのまま返すだけでなく、加工して返すこともできます。
C#private string firstName;
private string lastName;
public string FullName
{
get
{
return lastName + " " + firstName;
}
}
この例では、FullName は内部の2つの値を組み合わせて返しています。
表示用の値を作るときに便利です。
7-3. 年齢・価格・名前などのバリデーション例
年齢なら負の値を禁止し、価格なら 0 未満を禁止し、名前なら空文字や長すぎる文字列を防ぐ、といった使い方があります。
C#private string name;
public string Name
{
get => name;
set
{
if (string.IsNullOrWhiteSpace(value))
{
throw new ArgumentException("名前は空にできません。");
}
if (value.Length > 20)
{
throw new ArgumentException("名前は20文字以内で入力してください。");
}
name = value;
}
}
このように、プロパティは入力値の門番として機能します。
7-4. 自動実装プロパティではできない処理
自動実装プロパティは便利ですが、get や set の中に独自処理は書けません。
そのため、値の検証、加工、ログ出力などを行いたい場合は通常のプロパティを使う必要があります。
つまり、自動実装プロパティは「単純な受け渡し向け」、通常のプロパティは「制御が必要な場面向け」です。
7-5. カプセル化とget/setの関係
カプセル化とは、クラスの内部データをむやみに外へ見せず、必要な窓口だけを通して操作させる考え方です。get set はこのカプセル化を実現する代表的な仕組みです。
フィールドを直接公開するのではなく、プロパティを通して値を扱うことで、内部実装を隠しつつ安全性を高められます。
8. get/setとコンストラクタ・初期値の関係
プロパティを使うときは、初期値をどう入れるかも重要です。
コンストラクタと組み合わせることで、初期化漏れを防げます。
8-1. プロパティに初期値を設定する方法
自動実装プロパティには、初期値を直接つけることができます。
C#public string Name { get; set; } = "未設定";
このようにしておくと、値が設定されるまでの間も安全に扱えます。
初期値を明示しておくと、null や空の状態によるトラブルを減らせます。
8-2. コンストラクタでプロパティを初期化する方法
C#class Person
{
public string Name { get; private set; }
public Person(string name)
{
Name = name;
}
}
コンストラクタで初期値を与えると、オブジェクト生成時点で必要な値を確実に設定できます。
この方法は、必須項目があるデータで特に有効です。
8-3. getのみプロパティとコンストラクタの組み合わせ
読み取り専用プロパティは、コンストラクタとの相性が良いです。
C#class Order
{
public int OrderId { get; }
public Order(int orderId)
{
OrderId = orderId;
}
}
このようにすれば、生成時にだけ値を設定し、その後は変更できません。
変更不可の情報を扱う場合に向いています。
8-4. 初期化漏れを防ぐ書き方
初期化漏れを防ぐには、必須項目をコンストラクタで受け取る設計が有効です。
また、初期値を持たせたり、private set にしたりすることで、意図しない未設定状態を避けられます。
データの種類によって、初期値とコンストラクタのどちらを使うべきかを考えることが大切です。
9. get/setを使うメリットと注意点
get set は非常に便利ですが、何でもかんでも使えばよいわけではありません。
メリットと注意点の両方を理解しておくと、より適切に使えます。
9-1. 外部から安全にデータへアクセスできる
プロパティを使うと、外部から値を扱いやすくしながら、内部では制御を入れられます。
これにより、データの安全性を高められます。
9-2. 後から処理を追加しやすい
最初は単純に値を返すだけでも、後から set にバリデーションを追加したり、get に加工を追加したりできます。
フィールドを直接公開していると、このような拡張がしづらくなります。
9-3. コードの可読性が上がる
Name や Age のようなプロパティ名は、コードを読む人にとって意味が分かりやすいです。
また、アクセス制御も明示できるため、クラスの使い方が伝わりやすくなります。
9-4. 何でもget/setにすればよいわけではない
単純なローカル変数や、一時的な処理のための値までプロパティにする必要はありません。
プロパティは、クラスの状態を外部とやり取りするために使うのが基本です。
役割に合わない場面まで get set を使うと、逆にコードが読みづらくなることもあります。
9-5. 初心者がやりがちな悪い書き方
初心者がやりがちなのは、意味のない public フィールド を大量に作ることです。
また、すべてを自動実装プロパティにしてしまい、後から値チェックが必要になって困るケースもあります。
最初から「この値は変更してよいか」「チェックが必要か」を考えて設計することが大切です。
10. C#のget/setに関するよくある質問
10-1. get/setは必ず書く必要がある?
必ずではありません。
単純な値の保持なら自動実装プロパティで十分ですし、公開が不要ならフィールドをクラス内部だけで使うこともあります。
10-2. フィールドだけではだめ?
内部でしか使わないならフィールドだけでも問題ありません。
ただし、外部公開する値にはプロパティを使うほうが、制御や拡張の面で有利です。
10-3. getだけ・setだけでも使える?
使えます。get だけなら読み取り専用、set だけなら書き込み専用として定義できますが、実際には get だけのほうがよく使われます。
10-4. publicフィールドとpublicプロパティの違いは?
public フィールド は値をそのまま直接公開します。public プロパティ は、get や set を通してアクセスを制御できます。
外部から安全に値を扱いたいなら、基本的にはプロパティを使います。
10-5. 自動実装プロパティと通常のプロパティはどちらを使うべき?
値のチェックや加工が不要なら、自動実装プロパティで十分です。
値の制御が必要なら、通常のプロパティを使います。
迷ったら、まずは自動実装プロパティで書き、必要になったら通常のプロパティに切り替える考え方でも問題ありません。
まとめ
C# の get set は、プロパティを通して値を安全に扱うための重要な仕組みです。get は値の取得、set は値の代入を担当し、フィールドを直接公開せずにカプセル化を実現できます。
また、自動実装プロパティを使えば簡潔に書けますし、通常のプロパティを使えば値のチェックや加工も可能です。private set や get のみのプロパティを使い分けることで、クラスの安全性と保守性も高まります。
C# の get set を正しく理解すると、読みやすく安全なコードが書きやすくなります。
まずは「フィールドは内部の値」「プロパティは外部との窓口」という基本を押さえ、必要に応じて get と set を使い分けていきましょう。

