C#における「get」と「set」
最初は結構 わかりにくい概念だと思いますので、できるだけコードを使わないで説明します。
C#における「get」と「set」は、クラスのプロパティに対してアクセスや変更を制御するための方法です。
これを使うことで、オブジェクトの内部データを安全に操作することができます。
1. プロパティ
まず、クラスの中で「プロパティ」というものを使います。プロパティは、オブジェクトの内部データ(フィールド)に対するインターフェースです。
プロパティとは
プロパティは、オブジェクトの内部データ(フィールド)に対するアクセスポイントです。オブジェクト指向プログラミングでは、データを直接操作するのではなく、プロパティを通じて操作します。これにより、データの管理や保護が簡単になります。
具体例
イメージしやすいように、人の情報を管理する「Person」というクラスを考えてみましょう。このクラスは「名前」や「年齢」といったデータを持っています。
Personクラス: - 名前 (Name) - 年齢 (Age)
フィールドとプロパティの違い
フィールド: クラスの内部データそのもの。例えば、「name」という変数。
プロパティ: フィールドにアクセスするための窓口。例えば、「Name」というプロパティ。
プロパティの役割
プロパティは、以下のような役割を果たします。
データの取得と設定: プロパティを通じて、オブジェクトのデータを取得(読み取り)したり、設定(書き込み)したりします。
カプセル化: データを直接公開せず、プロパティを通じてのみアクセスさせることで、データの保護や制御がしやすくなります。
具体例での説明
たとえば、Personクラスの「名前」をフィールドとプロパティで表現します。
フィールドのみを使った場合
class Person
{ public string name; // 直接アクセスできるフィールド
}
この場合、外部から直接「name」にアクセスできますが、データの保護やバリデーションができません。
プロパティを使った場合
class Person
{ private string name; // プライベートフィールド
public string Name // プロパティ
{
get { return name; } // データを取得する
set { name = value; } // データを設定する
}
}
このように、フィールドをプライベートにして外部から直接アクセスできないようにし、プロパティを通じてのみデータにアクセスします。これにより、例えば「名前」に無効な値が設定されないようにするバリデーションを追加することも可能です。
フィールド: クラス内部のデータそのもの。
プロパティ: フィールドにアクセスするための窓口で、データの取得と設定を管理する。
メリット: データの保護、バリデーションの追加、メンテナンス性の向上。
プロパティを使うことで、オブジェクトの内部データに対する操作が安全かつ効率的になります。
2. get の役割
「get」は、プロパティの値を取得するための部分です。例えば、あるクラスのオブジェクトが「名前」というプロパティを持っているとしましょう。「get」を使うと、そのオブジェクトの「名前」を取得することができます。つまり、「名前」を外部から読み取るための方法です。
3. set の役割
「set」は、プロパティの値を設定するための部分です。同じ「名前」のプロパティを持つオブジェクトに対して、「set」を使うことで新しい名前を設定することができます。つまり、「名前」を外部から変更するための方法です。
具体例での説明
たとえば、クラスに「年齢」というプロパティがある場合を考えましょう。
get の使い方: 「年齢」を知りたいときに使います。「この人の年齢は何歳ですか?」という質問に答えるようなものです。
set の使い方: 「年齢」を設定したいときに使います。「この人の年齢を30歳に設定してください」という操作を行うようなものです。
メリット
カプセル化: オブジェクトの内部データを直接操作させず、安全にデータの取得と設定を行うことができます。
バリデーション: プロパティの値を設定する際に、値が正しいかどうかをチェックするコードを「set」の中に書くことができます。
メンテナンス性: プロパティの内部実装を変更しても、外部からのアクセス方法は変わらないため、コードの変更が容易です。
これらを通じて、C#のオブジェクト指向プログラミングにおいて、「get」と「set」はデータの安全かつ効率的な操作をサポートしています。
オブジェクト指向の大きな特徴の一つ カプセル化ですね。