C#のクラスメンバー - プロパティ

クラスを構成する要素の事をメンバーと言います。
プロパティは、フィールド(メンバー変数)の値を取得したり格納する為のものです。

フィールド(メンバー変数)の値を自由に変更できてしまうと、そのクラスにとって都合の悪い範囲外の値などが入れられてしまうかもしれません。このような事を避けてより安全なクラスを設計する為に、フィールドのアクセルレベルを private などに制限し、メソッド(メンバー変数)を介してフィールド値の取得や格納を行うという手段が取られる事があります。

C#では、このようなケースの為にプロパティという仕組みが用意されています。
プロパティは、クラスを設計する側からはメソッドのように扱う事ができ、クラスを利用する側からはフィールドのように使うことが出来るようになっています。



プロパティの定義

プロパティの定義は、値を取得する為の手段と値を格納する為の手段の2つを作成します。
これらはアクセサ(accessor)と呼ばれ、それぞれキーワード(予約語) getset を使って定義していきます。

アクセサはメソッドのように記述します。
値を取得する為の get では戻り値を返すようにキーワード(予約語) return を使います。
値を格納する為の set では格納しようとしている値をキーワード(予約語) value でアクセスします。

以下の例では Age という名前のプロパティを作成しています。
public class Person
{
    private int _Age;            // 他からアクセスできないようにしたフィールド

    public int Age               // _Ageフィールドへアクセスする為のAgeプロパティ
    {
        get                      // 値を取得する為のアクセサ
        {
            return _Age;
        }
        
        set                      // 値を格納する為のアクセサ
        {
            if (0 <= value)      // 0より小さい値が入らないよう制御している
            {
              _Age = value;
            }
        }
    }
}


省略した書き方

アクセサは省略した書き方も可能です。
public class Person
{
    public int Age { get; set; }
}
上のコートと下のコードは同じ意味になります。
public class Person
{
    private int _Age;
    
    public int Age
    {
        get
        {
            return _Age;
        }
        
        set
        {
            _Age = value;
        }
    }
}



プロパティ名の付け方とガイドライン

プロパティ名は一定のガイドラインに従って命名する事が推奨されています。
プロパティ名は単語の最初の文字を大文字(pascal形式)にした名詞または名詞句で命名しましょう。


プロパティのアクセシビリティ(アクセスのしやすさ)

プロパティ定義の前に public や private といった修飾子が付けられることがあります。
これらの修飾子はプロパティのアクセシビリティレベルを表していて以下のような制限があります。
  • public      ・・・ どこからでもアクセス可能
  • private     ・・・ このクラス内のコードからのみアクセス可能
  • protected ・・・ このクラス内のコードか、このクラスから派生したクラスからのみアクセス可能
アクセス修飾子が省略されたときは private になります。


アクセサのアクセシビリティ(アクセスのしやすさ)

getとsetどちらか1つにアクセス修飾子を付ける事ができます。
setにアクセス修飾子を付ける事で読み取り専用のプロパティにする事ができます。
public class Person
{
    public int Age { get; private set; }
}



プロパティの使い方

プロパティはフィールドと同じようにアクセスする事ができます。
プロパティへアクセスするには、クラスの変数名の後にピリオド「.」を付け、更にメンバ名を記述します。
変数名.プロパティ名;


サンプル

以下は「Person」というクラス定義のサンプルです。
public class Person
{
    private int _Age;            // 他からアクセスできないようにしたフィールド

    public int Age               // _Ageフィールドへアクセスする為のAgeプロパティ
    {
        get                      // 値を取得する為のアクセサ
        {
            return _Age;
        }
        
        set                      // 値を格納する為のアクセサ
        {
            if (0 <= value)      // 0より小さい値が入らないよう制御している
            {
              _Age = value;
            }
        }
    }
}



public class Program
{
    static void Main()
    {
        Person taro;
        taro = new Person();     // インスタンス生成
        taro.Age = 15;           // Ageプロパティのアクセサsetが実行される
        int tmp = taro.Age;      // Ageプロパティのアクセサgetが実行される
    }
}



コメント