C#におけるプロパティは、クラスのフィールド(変数)にアクセスするための特別なメソッドのようなものです。フィールドを直接公開するのではなく、プロパティを介してアクセスすることで、データの整合性を保ち、クラスの安全性を高めることができます。これは「カプセル化」というオブジェクト指向の重要な概念を実現するための機能です。
1. プロパティの基本的な構文
プロパティは、get
アクセサーとset
アクセサーから構成されます。
get
:フィールドの値を取得するための処理を記述します。set
:フィールドに値を設定するための処理を記述します。value
というキーワードを使って、設定される値を受け取ります。
基本的なコード例
以下のPerson
クラスには、name
というプライベートなフィールドと、それを操作するためのName
というプロパティがあります。
class Person
{
// フィールド(プライベート変数)
private string name;
// プロパティ
public string Name
{
get
{
// nameフィールドの値を返す
return name;
}
set
{
// nameフィールドに、渡された値(value)を設定する
name = value;
}
}
}
使用例
プロパティはフィールドを扱うのと同じように、直感的に使用できます。
Person person = new Person();
// プロパティを使って値を設定(set)
person.Name = "山田太郎";
// プロパティを使って値を取得(get)
Console.WriteLine(person.Name); // 出力: 山田太郎
2. 自動実装プロパティ(最もよく使われる形式)
ほとんどの場合、get
とset
で単純に値の取得と設定を行うだけであれば、上記のようにわざわざプライベートなフィールドを定義する必要はありません。C#には、より簡潔にプロパティを記述できる「自動実装プロパティ」という機能があります。
コード例
class Person
{
// 自動実装プロパティ
// コンパイラが内部的にプライベートなフィールドを自動生成してくれる
public string Name { get; set; }
public int Age { get; set; }
}
この書き方では、内部のフィールドを意識することなく、プロパティとして利用できます。
3. プロパティの利点(なぜ使うのか?)
なぜフィールドを直接public
にしないのでしょうか? プロパティには、以下のような重要な利点があります。
1. 不正な値からフィールドを保護する(カプセル化)
set
アクセサーの中に検証ロジックを記述することで、無効な値が設定されるのを防ぐことができます。
コード例
class Person
{
private int age;
public int Age
{
get { return age; }
set
{
// 年齢が0未満の場合は設定しない、といった検証が可能
if (value >= 0)
{
age = value;
}
else
{
Console.WriteLine("エラー: 不正な年齢が設定されました。");
}
}
}
}
2. 読み取り専用・書き込み専用に設定できる
get
またはset
の一方だけを記述することで、プロパティのアクセス権を制限できます。
読み取り専用プロパティ:
set
アクセサーを記述しないことで、外部から値を変更できないようにします。C#public string FullName { get; } = "田中花子"; // 読み取り専用
計算されたプロパティ: フィールドの値ではなく、別のプロパティやフィールドから計算した値を返すことも可能です。
C#public string FullName => FirstName + " " + LastName; // 読み取り専用の計算プロパティ
3. 後から機能追加が容易
プロパティの内部処理は後から自由に変更できます。たとえば、初めは単純な自動実装プロパティだったものを、後からset
にログ出力や検証処理を追加しても、プロパティを利用している外部のコードを変更する必要はありません。
まとめ
プロパティは、フィールドへの安全なアクセス手段です。
get
で値を取得、set
で値を設定します。自動実装プロパティを使えば、簡潔に記述できます。
カプセル化(値の検証など)や、後からの仕様変更に柔軟に対応できる点が最大のメリットです。
プログラミングの現場では、フィールドを直接public
にすることはほとんどなく、常にプロパティを使ってアクセスを制御するのがC#の一般的な開発スタイルです。
0 件のコメント:
コメントを投稿