かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

C言語の教科書に登場するひろ子さんをC#で書いてみよう

togetter.com

ひろ子さんは、他人の身長を180㎝にしてしまう能力があるみたいです。 例えば、ひろ子さんの能力をC#のメソッドにしてしまうと以下のようになるでしょう。

using System;

namespace Kowai
{
    class Program
    {
        static void Main(string[] args)
        {
            var taro = 167.5; // 太郎さんは167.5㎝でひろ子さんの理想とはかけ離れてる
            Console.WriteLine($"taro: {taro}cm");

            // ひろ子さんの魔の手にかかる
            Hiroko(ref taro);
            Console.WriteLine($"taro: {taro}cm");
        }

        private static void Hiroko(ref double height)
        {
            height = 180.0;
        }
    }
}

C#では、引数にrefを付けることで、参照渡しをすることが出来ます。

ref (C# リファレンス)

実行するとひろ子さんの手にかかった太郎さんは180㎝になっています。

taro: 167.5cm
taro: 180cm

オブジェクトにしてしまえば

さて、doubleみたいな単純な型の場合はrefをつけて参照を渡すことで値を書き換えるということをしましたが、オブジェクト指向っぽく書いてみた場合どうでしょう。

using System;

namespace Kowai
{
    class Program
    {
        static void Main(string[] args)
        {
            // 太郎さんは167.5㎝でひろ子さんの理想とはかけ離れてる
            var taro = new Men { Height = 167.5 };
            Console.WriteLine($"taro: {taro.Height}cm");

            // ひろ子さんの魔の手にかかる
            var hiroko = new Hiroko();
            hiroko.Tegome(taro);
            Console.WriteLine($"taro: {taro.Height}cm");
        }

    }

    class Men
    {
        public double Height { get; set; }
    }

    class Hiroko
    {
        public void Tegome(Men men)
        {
            men.Height = 180.0;
        }
    }
}

男性と、ひろ子さんをそれぞれクラスにして、ひろ子さんは男性の身長を180㎝にしてしまうというメソッドを持つ感じにしてみました。今回はrefを付けてない所がポイントです。実行してみると以下のようにrefを付けなくても太郎さんの身長が書き換わってることがわかります。

taro: 167.5cm
taro: 180cm

これは、オブジェクトへの参照の値を渡していて、その中身を書き換えてるため、こういう動作になってます。

まとめ

なんとなく、後半のクラスのインスタンスを引数に渡して中身を書き換えたときに呼び出し元でも中身の値が書き換わってるというのがわかると初心者を卒業する一歩になるかなぁとなんとなく思ったので適当に書いてみました。

では、よいC#ライフを!