C#を学び始めると、クラスや変数の次に出てくるのが「プロパティ(property)」という考え方です。そして、プロパティの中には必ずといっていいほど登場するのが、get
とset
というキーワード。
「なんとなく見たことはあるけど、何をしているのかよくわからない…」
「変数っぽいけど、関数みたいでもあるし、イマイチ使い方がピンとこない…」
そんなふうに感じたことはありませんか?
この記事では、C#初心者の方でも直感的に理解できるように、get
とset
の基本的な仕組みと使い方を、やさしく丁寧に解説していきます。
実際のコード例を交えながら、プロパティの使いどころや注意点についても紹介していくので、「なるほど、そういうことか!」とスッキリできるはずです。
初めてITに触れる方々のために、学習を助ける良書もご紹介しております。もしご興味があれば、そちらにも目を通していただければ嬉しく思います。
getとsetって何?
まずは、get
とset
が何をするものなのかをシンプルに理解しておきましょう。
C#では、クラスの中にある変数(=フィールド)を外から安全に読み書きするために、「プロパティ」という仕組みが用意されています。そして、そのプロパティの中で「値を読み取る」のがget
、「値を設定する」のがset
です。
ちょっと例を見てみましょう。
public class Person
{
private string name; // フィールド(直接外部からアクセスさせない)
public string Name
{
get { return name; } // 外部から値を読み取るときに使う
set { name = value; } // 外部から値を設定するときに使う
}
}
このクラスでは、name
という変数をprivate
にして外部から直接触れないようにしています。その代わり、Name
というプロパティを使って、get
で値を取得し、set
で値を変更できるようにしているのです。
getの役割
Console.WriteLine(person.Name); // nameの値を取り出す → getが呼ばれる
setの役割
person.Name = "Alice"; // nameに新しい値を設定する → setが呼ばれる
このように、プロパティを使えばフィールドへのアクセスをコントロールしながら、あたかも変数のように扱える、というメリットがあります。
自動実装プロパティについて
先ほどのように、get
とset
の中にフィールド(例:name
)を手動で書く方法は、仕組みがよくわかる反面、コードが少し長くなりがちです。
C#では、このような単純なプロパティをもっと簡潔に書けるようにするために、「自動実装プロパティ」という便利な記法が用意されています。
書き方の例
public class Person
{
public string Name { get; set; }
}
たったこれだけで、前の例と同じようにName
というプロパティを使って値の取得・設定ができるようになります。
この書き方では、C#が内部で自動的にフィールドを用意してくれるため、開発者はそれを意識せずにプロパティを利用できるのが特徴です。
var person = new Person();
person.Name = "Bob"; // setが使われる
Console.WriteLine(person.Name); // getが使われる
注意点
ただし、自動実装プロパティは「値の制御(バリデーション)」を行いたいときには向きません。set
の中で何か条件をチェックしたい場合などは、従来の形式で書く必要があります。
getとsetのカスタマイズ
ここまでで、get
とset
の基本的な使い方や、自動実装プロパティの便利さについて見てきました。
ここからは、プロパティの使い方をもう少し柔軟にカスタマイズする方法をご紹介します。
読み取り専用・書き込み専用のプロパティ
プロパティはget
とset
のどちらか一方だけを定義することもできます。
読み取り専用プロパティ(getのみ)
public class Product
{
private int price = 100;
public int Price
{
get { return price; }
}
}
この場合、price
は外部から読み取ることはできますが、変更はできません。
var p = new Product();
Console.WriteLine(p.Price); // OK
p.Price = 200; // コンパイルエラー!
書き込み専用プロパティ(setのみ)
public class Logger
{
private string latestLog;
public string Log
{
set { latestLog = value; }
}
}
これはあまり一般的ではありませんが、「書き込むだけで、外部から中身は見せたくない」といった用途に使えます。
setにバリデーション処理を入れる
set
の中では、値をそのまま代入するだけでなく、「その値が妥当かどうか」をチェックすることもできます。
private int age;
public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
}
}
この例では、負の値が入らないようにチェックしています。
こうすることで、クラスの中の状態を不正な値から守ることができます。
setをprivateにして、外部から変更できないようにする
「クラス内からは変更したいけど、外部からは変更させたくない」場合は、set
にprivate
アクセス修飾子をつけることができます。
public string Status { get; private set; }
これにより、外部からは読み取りだけ可能で、書き換えはクラス内部からしかできません。
まとめ
この記事では、C#のプロパティに登場するget
とset
について、基本から応用までを丁寧に解説してきました。
プロパティは、クラス設計における「カプセル化」を支える重要な機能のひとつです。
しっかりと使いこなせるようになれば、読みやすく、安全で、意図が明確なコードを書けるようになります。
まだ慣れないうちは「getとsetってなんだかややこしい…」と思うかもしれませんが、実際にコードを書きながら使っていくうちに、自然と感覚が身についていきます。
この記事がその第一歩となればうれしいです!
コメント