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

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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#ライフを!