C#プロパティとは?get/setの基本から自動実装・使い方まで初心者向けにわかりやすく解説
はじめに
C#を学び始めると、クラスの中でよく登場するのが「プロパティ」です。C#プロパティは、クラスが持つデータを外部から取得したり、変更したりするための仕組みです。
一見すると変数のように見えますが、実際にはgetやsetを使って値の取得・設定を制御できます。そのため、単にデータを保存するだけでなく、不正な値を防いだり、外部から勝手に変更されないようにしたりできます。
この記事では、C#プロパティとは何か、getとsetの基本、自動実装プロパティ、アクセス修飾子、読み取り専用プロパティ、実践的な使い方まで、初心者向けにわかりやすく解説します。
1. C#プロパティとは?初心者向けに基本をわかりやすく解説
C#プロパティとは、クラスの中にあるデータを外部から安全に扱うための仕組みです。
クラスには、名前、年齢、価格、在庫数など、さまざまなデータを持たせることがあります。これらのデータをそのまま外部に公開してしまうと、想定外の値が入る可能性があります。
そこで使うのがプロパティです。プロパティを使うことで、外部から値を取得したり、必要に応じて値を変更したりできます。
1-1. プロパティはクラスのデータを安全に扱うための仕組み
たとえば、人物を表すPersonクラスがあるとします。
C#public class Person
{
public string Name { get; set; }
}
このNameがプロパティです。
外部からは次のように使えます。
C#Person person = new Person();
person.Name = "田中";
Console.WriteLine(person.Name);
見た目は変数のようですが、プロパティは値を取得する処理と、値を設定する処理を内部に持っています。
1-2. フィールドとプロパティの違い
フィールドとは、クラスの中で直接データを保持する変数のことです。
C#public class Person
{
public string name;
}
このnameはフィールドです。
一方、プロパティは次のように書きます。
C#public class Person
{
public string Name { get; set; }
}
大きな違いは、プロパティにはgetとsetを使って、値の取得や設定を制御できる点です。
フィールドを直接publicにすると、どこからでも自由に値を変更できてしまいます。プロパティを使えば、読み取り専用にしたり、外部からの変更を禁止したり、不正な値をチェックしたりできます。
1-3. なぜC#ではプロパティを使うのか
C#では、クラスのデータを外部に公開するとき、フィールドを直接公開するよりもプロパティを使うのが一般的です。
理由は、クラスの内部構造を守りながら、必要なデータだけを外部に公開できるからです。
たとえば、年齢を表すAgeにマイナスの値が入ると不自然です。プロパティを使えば、setの中で値をチェックできます。
C#private int age;
public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
}
}
このように、プロパティは単なるデータの入れ物ではなく、データを守るための入口として使えます。
1-4. プロパティを使うメリット
C#プロパティを使う主なメリットは、データを安全に扱えることです。
外部から値を取得できるようにしつつ、変更は制限することができます。また、値を設定するときにチェック処理を入れることもできます。
さらに、自動実装プロパティを使えば、短いコードでシンプルに書けます。
C#public string Name { get; set; }
public int Age { get; set; }
プロパティを使うことで、コードの見た目がわかりやすくなり、クラスの使い方も整理されます。
2. C#プロパティの基本構文
C#プロパティは、基本的に次のような形で書きます。
C#アクセス修飾子 型 プロパティ名
{
get
{
return 値;
}
set
{
値 = value;
}
}
初心者が最初に理解すべきポイントは、getは値を取得するとき、setは値を設定するときに使われるということです。
2-1. getとsetの意味
getは、プロパティの値を読み取るときに実行されます。
C#Console.WriteLine(person.Name);
このようにプロパティの値を取得すると、getが呼び出されます。
一方、setはプロパティに値を代入するときに実行されます。
C#person.Name = "佐藤";
このように値を設定すると、setが呼び出されます。
つまり、getは「取り出す」、setは「入れる」と考えるとわかりやすいです。
2-2. プロパティの基本的な書き方
通常のプロパティは、内部に値を保存するためのフィールドを用意して書きます。
C#public class Person
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
この例では、nameがフィールド、Nameがプロパティです。
外部からはNameプロパティを通して値を扱います。
C#Person person = new Person();
person.Name = "鈴木";
Console.WriteLine(person.Name);
person.Name = "鈴木";でsetが実行され、Console.WriteLine(person.Name);でgetが実行されます。
2-3. getだけの読み取り専用プロパティ
プロパティは、getだけを書くこともできます。
C#public class Product
{
private int price = 1000;
public int Price
{
get
{
return price;
}
}
}
この場合、外部から値を取得することはできますが、代入はできません。
C#Product product = new Product();
Console.WriteLine(product.Price);
// product.Price = 2000; // エラー
getだけのプロパティは、外部から変更されたくない値を公開するときに便利です。
2-4. setだけの書き込み専用プロパティは使うべきか
C#では、setだけのプロパティを書くことも可能です。
C#public string Password
{
set
{
// 値を設定する処理
}
}
ただし、書き込み専用プロパティはあまり一般的ではありません。
理由は、外部から見たときに「値を設定できるのに取得できない」という動作がわかりにくいからです。特別な理由がない限り、setだけのプロパティよりも、メソッドを使ったほうが意図が伝わりやすい場合があります。
C#public void SetPassword(string password)
{
// パスワード設定処理
}
初心者のうちは、基本的にgetとsetをセットで使うか、getだけの読み取り専用プロパティを使うとよいでしょう。
2-5. プロパティへ値を代入・取得する方法
プロパティへの代入は、通常の変数と同じように書けます。
C#Person person = new Person();
person.Name = "山田";
プロパティの値を取得するときも、変数のように使えます。
C#Console.WriteLine(person.Name);
この手軽さが、C#プロパティの大きな特徴です。
内部ではgetやsetが動いていますが、使う側はシンプルに書けます。
3. get/setの使い方をサンプルコードで理解する
ここからは、getとsetの使い方をサンプルコードで確認していきます。
プロパティは、最初は少し難しく見えるかもしれません。しかし、実際の動きを見ると理解しやすくなります。
3-1. 通常のプロパティの使用例
次のコードは、名前を管理する基本的なプロパティの例です。
C#public class Person
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
使い方は次のとおりです。
C#Person person = new Person();
person.Name = "田中";
Console.WriteLine(person.Name);
実行すると、田中と表示されます。
3-2. getで値を返す仕組み
getは、プロパティの値を取得するときに使われます。
C#get
{
return name;
}
この部分は、Nameプロパティが呼び出されたときに、内部フィールドnameの値を返しています。
C#Console.WriteLine(person.Name);
このコードを書くと、Nameのgetが実行されます。
3-3. setで値を更新する仕組み
setは、プロパティに値を代入するときに使われます。
C#set
{
name = value;
}
たとえば次のように書いたとします。
C#person.Name = "佐藤";
このとき、setの中でvalueに"佐藤"が入り、name = value;によってフィールドの値が更新されます。
3-4. valueキーワードの意味
valueは、setの中で使える特別なキーワードです。
プロパティに代入された値が、自動的にvalueに入ります。
C#person.Name = "高橋";
この場合、setの中ではvalueが"高橋"になります。
C#set
{
name = value;
}
つまり、valueは「外部から代入された値」を表しています。
3-5. 入力値チェックをset内で行う方法
プロパティの便利な点は、setの中で値のチェックができることです。
たとえば、年齢にマイナスの値を入れたくない場合は、次のように書けます。
C#public class Person
{
private int age;
public int Age
{
get
{
return age;
}
set
{
if (value >= 0)
{
age = value;
}
}
}
}
使い方は次のとおりです。
C#Person person = new Person();
person.Age = 20;
Console.WriteLine(person.Age);
person.Age = -5;
Console.WriteLine(person.Age);
この例では、-5は不正な値なので、ageには代入されません。
より明確にエラーを出したい場合は、例外を投げることもあります。
C#set
{
if (value < 0)
{
throw new ArgumentException("年齢にマイナスの値は設定できません。");
}
age = value;
}
実務では、不正な値を静かに無視するよりも、例外を使って問題を知らせるほうが適している場合も多いです。
4. 自動実装プロパティとは
自動実装プロパティとは、フィールドを明示的に書かずに使えるプロパティです。
C#では、次のように短く書けます。
C#public string Name { get; set; }
この書き方では、内部で値を保存するためのフィールドが自動的に用意されます。初心者がC#プロパティを使うとき、最初に覚えるべき便利な書き方です。
4-1. 自動実装プロパティの基本構文
自動実装プロパティの基本構文は次のとおりです。
C#public 型 プロパティ名 { get; set; }
具体例は次のようになります。
C#public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
使い方は通常のプロパティと同じです。
C#Person person = new Person();
person.Name = "田中";
person.Age = 25;
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
4-2. 通常のプロパティとの違い
通常のプロパティでは、フィールドを自分で用意します。
C#private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
自動実装プロパティでは、これを短く書けます。
C#public string Name { get; set; }
ただし、自動実装プロパティでは、getやsetの中に独自の処理を書くことはできません。
値チェックなどの処理が必要な場合は、通常のプロパティを使います。
4-3. 自動実装プロパティを使うメリット
自動実装プロパティのメリットは、コードが短く、読みやすくなることです。
C#public string Title { get; set; }
public int Price { get; set; }
public int Stock { get; set; }
このように、単純に値を保持するだけなら、自動実装プロパティで十分です。
フィールドを毎回書く必要がないため、コード量を減らせます。また、データを表すクラスを作るときにもよく使われます。
4-4. 自動実装プロパティが向いているケース
自動実装プロパティが向いているのは、特別なチェックや変換が不要なケースです。
たとえば、名前、メールアドレス、タイトル、説明文など、単純に値を保持するだけなら自動実装プロパティが適しています。
C#public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
一方、年齢や価格のように、不正な値を防ぎたい場合は通常のプロパティを検討します。
4-5. 初期値を設定する方法
自動実装プロパティには、初期値を設定できます。
C#public class Person
{
public string Name { get; set; } = "未設定";
public int Age { get; set; } = 0;
}
このように書くと、オブジェクトを作成した時点で初期値が入ります。
C#Person person = new Person();
Console.WriteLine(person.Name); // 未設定
Console.WriteLine(person.Age); // 0
初期値を設定しておくと、値の入れ忘れによる不具合を減らせます。
5. アクセス修飾子とプロパティの公開範囲
C#プロパティでは、public、private、protected、internalなどのアクセス修飾子を使って、公開範囲を決められます。
どこからプロパティを使えるようにするかは、クラス設計で重要なポイントです。
5-1. publicプロパティの使い方
publicプロパティは、クラスの外部からアクセスできます。
C#public class Person
{
public string Name { get; set; }
}
この場合、外部から次のように代入・取得できます。
C#Person person = new Person();
person.Name = "田中";
Console.WriteLine(person.Name);
publicは便利ですが、何でも公開すればよいわけではありません。外部から自由に変更されて困る値には注意が必要です。
5-2. private setで外部からの変更を防ぐ方法
private setを使うと、外部から値を取得できるものの、変更はクラス内部だけに制限できます。
C#public class User
{
public string Name { get; private set; }
public User(string name)
{
Name = name;
}
}
外部からは読み取りだけ可能です。
C#User user = new User("田中");
Console.WriteLine(user.Name);
// user.Name = "佐藤"; // エラー
private setは、外部から勝手に変更されたくない値に使います。
5-3. protectedやinternalを使うケース
protectedは、そのクラス自身と派生クラスからアクセスできるようにする修飾子です。
C#public class BaseUser
{
protected string Role { get; set; }
}
継承したクラスで使いたいが、完全に外部公開はしたくない場合に使います。
internalは、同じプロジェクト内からアクセスできるようにする修飾子です。
C#internal string Code { get; set; }
ライブラリの内部では使いたいが、外部のプロジェクトには公開したくない場合に使われます。
5-4. フィールドはprivate、プロパティはpublicが基本
C#では、フィールドはprivateにして、外部にはプロパティを通して公開するのが基本です。
C#public class Product
{
private int price;
public int Price
{
get
{
return price;
}
set
{
if (value >= 0)
{
price = value;
}
}
}
}
この形にすると、内部データを直接変更されることを防ぎつつ、必要な操作だけを公開できます。
単純な値であれば、自動実装プロパティを使っても構いません。
C#public string Name { get; set; }
5-5. カプセル化とプロパティの関係
カプセル化とは、クラスの内部データを外部から直接触れないようにし、必要な操作だけを公開する考え方です。
プロパティは、このカプセル化を実現するためによく使われます。
たとえば、年齢を表すageフィールドを直接公開せず、Ageプロパティを通して操作させれば、不正な値を防げます。
C#private int age;
public int Age
{
get { return age; }
set
{
if (value < 0)
{
throw new ArgumentException("年齢は0以上である必要があります。");
}
age = value;
}
}
このように、プロパティは安全で保守しやすいクラスを作るために重要です。
6. 読み取り専用・変更不可のプロパティ
C#プロパティには、外部から変更できない読み取り専用の形があります。
値を一度設定したら変えたくない場合や、外部には見せたいが変更されたくない場合に使います。
6-1. getのみのプロパティ
getのみのプロパティは、外部から値を取得できますが、代入はできません。
C#public class Product
{
public string Name { get; }
public Product(string name)
{
Name = name;
}
}
使い方は次のとおりです。
C#Product product = new Product("ノートPC");
Console.WriteLine(product.Name);
// product.Name = "スマートフォン"; // エラー
このように、コンストラクターで値を設定し、その後は変更できないようにできます。
6-2. readonlyフィールドとの違い
readonlyフィールドも、一度設定したら変更しにくい値を表すために使います。
C#private readonly string name;
readonlyフィールドはフィールドなので、通常はクラス内部で使います。
一方、getのみのプロパティは、外部に値を公開するために使いやすい形です。
C#public string Name { get; }
つまり、内部で保持するだけならreadonlyフィールド、外部に公開するなら読み取り専用プロパティを使う、と考えるとわかりやすいです。
6-3. コンストラクターで値を設定する方法
読み取り専用プロパティは、コンストラクターで値を設定できます。
C#public class User
{
public int Id { get; }
public string Name { get; }
public User(int id, string name)
{
Id = id;
Name = name;
}
}
オブジェクト作成時に値を渡します。
C#User user = new User(1, "田中");
Console.WriteLine(user.Id);
Console.WriteLine(user.Name);
ユーザーIDのように、作成後に変更されるべきでない値に適しています。
6-4. initアクセサーの使い方
initアクセサーを使うと、オブジェクト作成時だけ値を設定できるプロパティを作れます。
C#public class User
{
public int Id { get; init; }
public string Name { get; init; }
}
オブジェクト初期化子で値を設定できます。
C#User user = new User
{
Id = 1,
Name = "田中"
};
作成後に変更しようとするとエラーになります。
C#// user.Name = "佐藤"; // エラー
initは、初期化時には柔軟に値を設定したいが、その後は変更させたくない場合に便利です。
6-5. 不変オブジェクトを作るときの考え方
不変オブジェクトとは、作成後に状態が変わらないオブジェクトのことです。
不変オブジェクトを作ると、値が途中で変わらないため、コードの動きを予測しやすくなります。
C#public class Product
{
public string Name { get; init; }
public int Price { get; init; }
}
このようにinitを使うと、初期化時だけ値を設定できるデータクラスを作れます。
不変にしたい値には、getのみ、private set、initなどを使い分けるとよいでしょう。
7. プロパティとメソッドの使い分け
C#では、値を取得するためにプロパティを使うこともあれば、メソッドを使うこともあります。
どちらを使うべきか迷う場合は、「値のように扱えるか」「処理が重くないか」を基準にすると判断しやすくなります。
7-1. プロパティを使うべきケース
プロパティは、オブジェクトの状態や属性を表すときに使います。
C#public string Name { get; set; }
public int Age { get; set; }
名前や年齢のように、データとして自然に見えるものはプロパティに向いています。
また、計算結果であっても軽い処理ならプロパティとして書けます。
C#public string FullName
{
get
{
return LastName + FirstName;
}
}
7-2. メソッドを使うべきケース
メソッドは、何らかの処理や動作を表すときに使います。
C#public void Save()
{
// 保存処理
}
また、引数が必要な処理や、実行するたびに結果が変わる処理もメソッドに向いています。
C#public decimal CalculateDiscount(decimal rate)
{
return Price * rate;
}
「値」ではなく「処理」として見えるものは、メソッドにするとわかりやすくなります。
7-3. 処理が重い場合はプロパティにしない
プロパティは、使う側から見ると変数のように見えます。
そのため、プロパティに重い処理を書くと、使う側が気づかないうちに時間のかかる処理を呼び出してしまう可能性があります。
たとえば、ファイル読み込み、データベースアクセス、ネットワーク通信などは、プロパティではなくメソッドにするほうが自然です。
C#public string LoadFileContent()
{
// ファイル読み込み処理
}
プロパティは、基本的に軽い処理にとどめるのがよいでしょう。
7-4. 初心者が迷いやすい判断基準
初心者が迷ったときは、次のように考えると判断しやすいです。
名前、年齢、価格、状態のような「データ」はプロパティにします。
保存する、計算する、読み込む、送信するなどの「動作」はメソッドにします。
C#public int Price { get; set; } // プロパティ
public void Save() // メソッド
public int CalculateTotalPrice() // メソッド
使う側が「値を見ている」と感じるならプロパティ、「何かを実行している」と感じるならメソッドを選ぶとよいです。
8. C#プロパティの実践的な使い方
ここでは、C#プロパティを実際のクラスでどのように使うのかを見ていきます。
基本構文だけでなく、実践的な例を見ることで、プロパティの使いどころが理解しやすくなります。
8-1. クラスで名前や年齢を管理する例
人物の名前と年齢を管理するクラスを作ってみます。
C#public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
使い方は次のとおりです。
C#Person person = new Person();
person.Name = "田中";
person.Age = 30;
Console.WriteLine($"{person.Name}さんは{person.Age}歳です。");
単純なデータを管理するだけなら、このように自動実装プロパティで十分です。
8-2. 不正な値を防ぐプロパティの例
年齢にマイナスの値を入れたくない場合は、通常のプロパティを使います。
C#public class Person
{
private int age;
public int Age
{
get
{
return age;
}
set
{
if (value < 0)
{
throw new ArgumentException("年齢は0以上で指定してください。");
}
age = value;
}
}
}
このように書くと、不正な値が設定されたときにエラーとして知らせることができます。
C#Person person = new Person();
person.Age = 20;
// person.Age = -1; // 例外が発生
プロパティを使うことで、クラスの状態を正しく保てます。
8-3. 計算結果を返すプロパティの例
プロパティは、保存された値だけでなく、計算結果を返すこともできます。
C#public class Rectangle
{
public int Width { get; set; }
public int Height { get; set; }
public int Area
{
get
{
return Width * Height;
}
}
}
使い方は次のとおりです。
C#Rectangle rectangle = new Rectangle();
rectangle.Width = 10;
rectangle.Height = 5;
Console.WriteLine(rectangle.Area);
Areaはフィールドとして値を持っているわけではありません。WidthとHeightから計算した結果を返しています。
このような読み取り専用の計算プロパティは、実践でもよく使われます。
8-4. オブジェクト初期化子とプロパティ
C#では、オブジェクト初期化子を使って、プロパティにまとめて値を設定できます。
C#public class Book
{
public string Title { get; set; }
public string Author { get; set; }
public int Price { get; set; }
}
次のように書けます。
C#Book book = new Book
{
Title = "C#入門",
Author = "山田太郎",
Price = 2500
};
オブジェクト初期化子を使うと、コードが読みやすくなります。
データをまとめて設定したい場合に便利です。
8-5. データクラスでよく使うプロパティ
データを表すクラスでは、自動実装プロパティがよく使われます。
C#public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
このようなクラスは、データベースの情報や画面入力の情報を扱うときによく登場します。
外部から変更されたくない値がある場合は、private setやinitを使うとよいでしょう。
C#public class Customer
{
public int Id { get; init; }
public string Name { get; set; }
public string Email { get; set; }
}
9. C#プロパティで初心者がつまずきやすいポイント
C#プロパティは便利ですが、初心者がつまずきやすいポイントもあります。
よくあるミスを知っておくと、エラーの原因を見つけやすくなります。
9-1. フィールドを直接publicにしてはいけない理由
初心者のうちは、次のようにフィールドをpublicにしてしまうことがあります。
C#public class Person
{
public int age;
}
この書き方でも動きますが、外部から自由に値を変更できてしまいます。
C#Person person = new Person();
person.age = -10;
年齢に-10が入っても防げません。
プロパティを使えば、値をチェックできます。
C#private int age;
public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
}
}
基本的には、フィールドを直接publicにするのではなく、プロパティを使いましょう。
9-2. get/setを書き忘れたときのエラー
プロパティを書くときは、getやsetが必要です。
C#public string Name { get; set; }
次のような書き方は、プロパティとして正しくありません。
C#public string Name;
これはプロパティではなくフィールドです。
また、自動実装プロパティでは、get;やset;のセミコロンを書き忘れないようにしましょう。
C#public string Name { get; set; }
9-3. 自動実装プロパティで処理を書けない理由
自動実装プロパティは便利ですが、getやsetの中に処理を書くことはできません。
C#public int Age { get; set; }
この形は、単純に値を保存するための書き方です。
値チェックをしたい場合は、通常のプロパティにします。
C#private int age;
public int Age
{
get { return age; }
set
{
if (value < 0)
{
throw new ArgumentException("年齢は0以上で指定してください。");
}
age = value;
}
}
単純な値なら自動実装プロパティ、処理が必要なら通常のプロパティ、と使い分けましょう。
9-4. setをprivateにしたときに代入できない原因
private setを使うと、クラスの外部からは代入できません。
C#public class User
{
public string Name { get; private set; }
}
次のように外部から代入しようとするとエラーになります。
C#User user = new User();
// user.Name = "田中"; // エラー
これは、setがprivateになっているためです。
値を設定したい場合は、コンストラクターやクラス内のメソッドから設定します。
C#public class User
{
public string Name { get; private set; }
public User(string name)
{
Name = name;
}
public void ChangeName(string name)
{
Name = name;
}
}
9-5. プロパティ名とフィールド名の命名ルール
C#では、プロパティ名は先頭を大文字にするのが一般的です。
C#public string Name { get; set; }
一方、フィールド名は先頭を小文字にする、またはアンダースコアを付けることがあります。
C#private string name;
private string _name;
たとえば、次のように書けます。
C#private string name;
public string Name
{
get { return name; }
set { name = value; }
}
または次のように書きます。
C#private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
命名ルールをそろえると、フィールドとプロパティの違いがわかりやすくなります。
10. C#プロパティのベストプラクティス
C#プロパティを使うときは、いくつかの基本方針を意識すると、読みやすく保守しやすいコードになります。
初心者のうちは、難しく考えすぎず、まずはよく使われるパターンを覚えることが大切です。
10-1. 基本は自動実装プロパティを使う
単純に値を保持するだけなら、自動実装プロパティを使うのがおすすめです。
C#public string Name { get; set; }
public int Age { get; set; }
コードが短くなり、読みやすくなります。
不要なフィールドを自分で書く必要もありません。
10-2. 値チェックが必要な場合は通常のプロパティを使う
値チェックが必要な場合は、通常のプロパティを使います。
C#private int price;
public int Price
{
get { return price; }
set
{
if (value < 0)
{
throw new ArgumentException("価格は0以上で指定してください。");
}
price = value;
}
}
価格、年齢、数量など、不正な値が入ると困るものは、setでチェックすることを検討しましょう。
10-3. 外部から変更されたくない値はprivate setにする
外部から値を見せたいが、変更されたくない場合はprivate setを使います。
C#public int Id { get; private set; }
たとえば、ユーザーIDや注文番号など、作成後に勝手に変更されると困る値に向いています。
C#public class Order
{
public int OrderId { get; private set; }
public Order(int orderId)
{
OrderId = orderId;
}
}
10-4. プロパティにはわかりやすい名前を付ける
プロパティ名は、何を表しているのかがすぐにわかる名前にしましょう。
C#public string Name { get; set; }
public int Age { get; set; }
public int Price { get; set; }
短すぎる名前や意味があいまいな名前は避けます。
C#public string N { get; set; } // わかりにくい
読みやすい名前を付けることで、チーム開発でもコードの理解がしやすくなります。
10-5. チーム開発で読みやすいコードにするコツ
チーム開発では、プロパティの書き方をそろえることが大切です。
たとえば、自動実装プロパティを基本にし、値チェックが必要な場合だけ通常のプロパティを使う、というルールにすると読みやすくなります。
C#public string Name { get; set; }
public int Age { get; set; }
また、外部から変更できるかどうかも明確にしましょう。
C#public int Id { get; private set; }
public DateTime CreatedAt { get; init; }
プロパティの公開範囲を適切に設定すると、クラスの使い方がわかりやすくなり、不具合も防ぎやすくなります。
11. C#プロパティに関するよくある質問
ここでは、C#プロパティについて初心者が疑問に感じやすい点をまとめます。
11-1. C#のプロパティと変数の違いは?
変数は値を保存するためのものです。
プロパティも見た目は変数のように使えますが、内部にgetやsetを持っており、値の取得や設定を制御できます。
C#public string Name { get; set; }
プロパティを使うと、外部から安全に値を扱えるようになります。
11-2. getとsetは必ず必要?
必ず両方必要というわけではありません。
読み取りと書き込みの両方を許可したい場合は、getとsetを両方書きます。
C#public string Name { get; set; }
読み取り専用にしたい場合は、getだけにできます。
C#public string Name { get; }
外部から変更されたくない場合は、private setもよく使われます。
C#public string Name { get; private set; }
11-3. 自動実装プロパティだけ覚えればよい?
最初は自動実装プロパティを覚えるだけでも、多くの場面で使えます。
C#public string Name { get; set; }
ただし、値チェックや特別な処理が必要になったときは、通常のプロパティも必要です。
C#private int age;
public int Age
{
get { return age; }
set
{
if (value < 0)
{
throw new ArgumentException("年齢は0以上で指定してください。");
}
age = value;
}
}
そのため、自動実装プロパティを基本として覚え、必要に応じて通常のプロパティを使えるようにするとよいです。
11-4. private setはどんなときに使う?
private setは、外部から値を読み取れるようにしたいが、変更はクラス内部だけにしたい場合に使います。
C#public int Id { get; private set; }
ユーザーID、注文番号、作成日時など、外部から勝手に変更されると困る値に向いています。
C#public class User
{
public int Id { get; private set; }
public User(int id)
{
Id = id;
}
}
11-5. プロパティとフィールドはどちらを使うべき?
外部に公開するデータには、基本的にプロパティを使います。
フィールドは、クラス内部でデータを保持するためにprivateで使うのが一般的です。
C#private int age;
public int Age
{
get { return age; }
set { age = value; }
}
単純なデータなら、自動実装プロパティを使えば十分です。
C#public string Name { get; set; }
迷った場合は、「外部から使うものはプロパティ、内部だけで使うものはフィールド」と考えるとわかりやすいです。
まとめ
C#プロパティは、クラスのデータを安全に扱うための重要な仕組みです。
プロパティを使うと、外部から値を取得したり、設定したりできます。また、getとsetを使うことで、値の読み取りや変更を制御できます。
単純に値を保持するだけなら、自動実装プロパティを使うとコードを短く書けます。
C#public string Name { get; set; }
一方、値チェックや特別な処理が必要な場合は、通常のプロパティを使います。
C#private int age;
public int Age
{
get { return age; }
set
{
if (value < 0)
{
throw new ArgumentException("年齢は0以上で指定してください。");
}
age = value;
}
}
外部から変更されたくない値には、private set、getのみ、initなどを使うと安全です。
C#プロパティを理解すると、クラスの設計がわかりやすくなり、保守しやすいコードを書けるようになります。まずは自動実装プロパティから使い始め、必要に応じて通常のプロパティやアクセス修飾子を使い分けていきましょう。

