読者です 読者をやめる 読者になる 読者になる

プロパティ

プロパティは表記としてはフィールドへのアクセスだけど、中身はメソッドとして実装されている。
要は、アクセサメソッドって呼び出し面倒だし、直感的じゃないよねー、ということで出てきたものなんだと思う。

using System;

class Program
{
    private int data;

    public int Data
    {
        get
        {
            return data;
        }
        set
        {
            // 暗黙の引数valueに値が入っている
            if (value < 0)
                throw new Exception();
            data = value;
        }
    }

    static void Main(string[] args)
    {
        Program p = new Program();
        p.Data = 100;
        Console.WriteLine(p.Data);
        try
        {
            p.Data = -10;
        }
        catch (Exception)
        {
            Console.WriteLine("error.");
        }
    }
}

と、こんな感じで呼び出し側はフィールドのように、呼び出される側はメソッドのように記述できる。


getだけ書いてsetを書かないと読み取り専用に、setだけ書いてgetを書かないと書き込み専用にできる。
さらに、getやsetに個別にアクセス修飾子を設定することもできる。その際、何も指定しないとプロパティ自体に設定されたアクセス修飾子が指定されたものとみなされる。
上の例では、getやsetにアクセス修飾子が付いていないので、Dataのアクセス修飾子のpublicが指定されたものとみなされる。
また、プロパティ自体に設定されたアクセス修飾子よりも制限の強いものだけが指定できるという点に注意しなければならない。protectedなプロパティのsetterにpublicは指定出来ないので、プロパティはpublicにして、getterの方をprotectedにすればいい。
暗黙の引数valueの型はプロパティの型と同じになるのかな。設定は文字列で、取得は数値で、とかは不可能っぽい。できるのかもしれないけど今のところはそういう例はない*1


と、何気に便利そうなプロパティだけど、個人的にはあまり好きではない。
何でかというと、そんなプリミティブなレベルの操作なんてそうそう必要ないでしょ、と思うから*2
それに、中でとんでもなく重い処理してたり、実はフィールドにアクセスしてるんじゃなくて、DBにアクセスしてます、なんてこともあるかもしれないのに、表記としてはフィールドへのアクセスと同じだから分かりにくい。

*1:それが必要かどうか微妙だけど

*2:昔はGUIとかDB周りは仕方ないかも、と思っていたけど、最近はそこらへんに関してもアクセッサなんて・・・と思うようになってきた