白猫のメモ帳

JavaとかC#とかJavaScriptとかHTMLとか機械学習とか。

プロパティとかインデクサはインクリメントできる

こんにちは。

気温の変化についていけない私です。
今日はC#ネタ。

C#にはプロパティという便利な機能があります。
Javaばっかり書いていた私としては単なるアクセサの便利な書き方くらいに思っていたのですが、
ふと違いに気づいたのでメモ。

たとえばこんなint型のプロパティを持つクラスを作って、

class Test
{
    internal int Cnt { get; set; }
}

こんな風にインクリメントするとちゃんと演算してくれます。

var test = new Test();
Console.WriteLine(test.Cnt);
test.Cnt++;
Console.WriteLine(test.Cnt);

0
1

おお賢い。
ということはきっとインデクサもこんな風にすれば、

class Test
{
    private int[] ary = new int[1];
    internal int this[int i]
    {
        get => ary[i];
        set => ary[i] = value;
    }
}

インクリメントできる!

var test = new Test();
Console.WriteLine(test[0]);
test[0]++;
Console.WriteLine(test[0]);

0
1

単なるgetterだと考えるとこんなことはできません。
(intは参照型じゃないので)

これはインクリメント演算子がちゃんとgetterで取って、setterで入れているからなんでしょう。
ということはですよ、こんないたずらをすれば・・・

private int cnt;
internal int Cnt
{
    get => cnt;
    set => cnt = value + 1;
}

インクリメントしただけなのに、

var test = new Test();
Console.WriteLine(test.Cnt);
test.Cnt++;
Console.WriteLine(test.Cnt);

0
2

2増えた!

なるほど。楽しい。
よいこは真似しないようにしましょう。