get,setアクセサに独自の処理を実装する

プログラミングC# 第6版 3.2.3



アクセサには独自の処理を実装することが可能なようです。

using System;

class CSample {
    public CSample (double val) {
        foo = val;
    }
    public double foo;
    public double bar {
        get {
            return foo * 2;
        }
        set {
            foo = value / 2;
        }
    }
}

class Program {
    static void Main () {
        CSample obj = new CSample(10.0);
        
        Console.WriteLine(obj.foo); // 10
        
        obj.bar = 4;
        Console.WriteLine(obj.bar); // 4
        
        Console.WriteLine(obj.foo); // 2
    }
}
$ main
10
4
2

barに4を代入して表示させてみると、4と表示されます。このbarの使用者には単にbarに4を入れて4が返ってきただけに見えますが、クラス内部では実装が入っています。

実際にはfooの値を書き換えているので最後にfooを表示させてみると「2」が表示されることとなります。

これは便利と言えば便利なんですが、プロパティに値を設定しただけなのに、何かしらの処理が動いているので注意が必要かもしれません。

上記のようなことをするんであれば普通にメソッドでやった方が見た目のわかりやすさは上なのかなぁという気はします。

using System;

class CSample {
    public CSample (double val) {
        foo = val;
    }
    public double foo;
    
    public double GetFoo () {
        return foo * 2;
    }
    public void SetFoo (double value) {
        foo = value / 2;
    }
}

class Program {
    static void Main () {
        CSample obj = new CSample(10.0);
        
        Console.WriteLine(obj.foo); // 10
        
        obj.SetFoo(4);
        Console.WriteLine(obj.GetFoo()); // 4
        
        Console.WriteLine(obj.foo); // 2
    }
}

しかしまぁこれはC#のプロパティはそういうもんだとちゃんと理解していればそこまで注意することでもないかもしれないですね。

いや、むしろタイプ量も減るし便利なのかも?