ハルの読書と勉強録

読書の記録や勉強の覚書です。

【C#】アクセサーとプロパティ

クラスで使用されるプロパティとアクセサーの基本的なことをまとめました。

言語はC#を使用しています。

アクセサーとは

フィールド設定・取得専用の処理

高橋 麻奈(2016).やさしいC# 第2版 SBクリエイティブ

クラス内でprivateで宣言された変数(フィールド)の値を外部から取得・設定するための処理(メソッド)をアクセサー(accessor)と言います。

外部からのフィールドへのアクセスを、アクセサーを通してのみに制限することで、カプセル化を実現します。

アクセサーの記述例

定義例

class Poster
{
    //フィールド
    // アクセス修飾子 型名 変数名;
    int height; //アクセス修飾子省略時はprivateが設定される
 
    //アクセサーを記述
    public int GetHeight() 
    {
        //値の参照時に実施する処理を記述
        return height;
    }
    public void SetHeight(int height)
    {
        //値の代入時に実施する処理を記述
        this.height = height;
    }
 //~~~省略~~~
}

使用例

class Sample
{
    public static void Main()
    {
        Poster p = new Poster();
        p.SetHeight(100);
        Console.WriteLine(p.GetHeight); //100
    }
}

プロパティとは

setとgetという名前のフィールド設定・取得専用の処理を用意しておくしくみ

高橋 麻奈(2016).やさしいC# 第2版 SBクリエイティブ

C#では、プロパティと呼ばれるアクセサーに対応したメンバーを使用できます。プロパティを使用すると、privateで宣言されたフィールドの値の取得や設定を行う手段を外部に提供できます。

髙江 賢(2018).基礎からしっかり学ぶC#の教科書 日経BP

「アクセサーに対応した、フィールド設定・取得専用のメンバー」です。

プロパティを使用すると、特に利用する側(呼び出す側)の記述がよりシンプルになります。

以下の記述例で、先ほどのアクセサー部分をプロパティを使用した形に書き換えてみます。

プロパティの記述例

定義例

class Poster
{
    //フィールド
    // アクセス修飾子 型名 変数名;
    int height; //アクセス修飾子省略時はprivateが設定される
 
    //プロパティを定義
    public int Height 
    {
        set 
        {
            //値の代入時に実施する処理を記述
            this.height = value;
        }
        get
        {
            //値の参照時に実施する処理を記述
            return height;
        }
    }
 //~~~省略~~~
}

使用例

class Sample
{
    public static void Main()
    {
        Poster p = new Poster();
        p.Height = 100;
        Console.WriteLine( p.Height ); //100
    }
}

【補足】

プロパティのsetアクセサー内の「value」は、利用する側から渡される値を格納することができます。「value」は自動で定義されたパラメーターであり、使用前の宣言は不要です。

C# 2.0以降は、プロパティのsetとgetに異なるアクセスレベル(アクセス修飾子)を設定できます。

自動プロパティ(C# 3.0)

単純な値の設定と取得のみであれば、フィールドの宣言とプロパティの定義方法を簡略化し、下記のように記述できます。

記述例

class Poster
{
    public int Height { get; set; }
//~~~省略~~~
}

プロパティの定義のみで、フィールドの宣言をしていませんが、この記述でコンパイル時に自動で内部にフィールドが作成されます。

自動作成されるフィールドの型は、 プロパティで定義した型となります。

また、自動作成されたフィールドにはプロパティのアクセサーを介してのみアクセスが可能です。

プロパティ定義数が多い際に、コードの冗長さが軽減できます。

参考書籍

関連記事