【C#】Action<T>って何?

C#

C、Java、Rubyを学生時代勉強した自分にとってC#は馴染みのない便利要素が色々あるらしい
この本がAmazonで評価が高かったので購入し、興味のある順で読んでみていると

【出井 秀行. 実戦で役立つ C#プログラミングのイディオム/定石&パターン (Kindle の位置No.2300). 株式会社技術評論社. 】

Action<T>とかいう謎の表現が出現

調べて理解したことを書いていこうと思います。

まずはDelegateの知識が必要?

Delegate(委任する)発音

何かを任せるという意味ですね。発音もせっかくなので覚えておきましょう!

まず使用例

    delegate bool dlgtTest(int num);

    void JudgeNum(int[] nums, dlgtTest test)//該当する数値を表示するメソッド
    {
        for (int i = 0; i < nums.Length; i++)
        {
            if (test(nums[i]) == true)
            {
                Debug.Log(nums[i] + ",");
            }
        }
    }
    private void Start()
    {
        int[] arr = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        JudgeNum(arr, delegate(int num) { if (num % 2 == 0) return true; return false; });
        //偶数判定
        JudgeNum(arr, delegate (int num) { if (num >= 5) return true; return false; });
        //5以上の数値判定
    }

Delegateは要するにメソッドの引数にメソッドを定義することができるというものです。

16行目 delegate(int num) { if (num % 2 == 0) return true; return false; }の部分がDelegate型のメソッドです。

引数int型でboolを返すものであれば何でもOKとなります。

C言語などの古い言語ではint型、Char型などの単純な引数しか使えなかったので非常に便利ですね。

Action<T>って結局何者?

Microsoftの公式ドキュメントを見たところ

Action<T>とは引数を1つ持ち、値を返さないDelegateのことでした。

    delegate void dlgtTest(object obj);

    void Hoge(object obj)
    {

    }
    private void Start()
    {
        dlgtTest d = Hoge;
        Action<object> a = Hoge;
    }

Action<object>は引数を一つ持つDelegateと全く同じ意味で定義できます。

こんな面白いこともできました。

    delegate void dlgtTest(object obj);

    private void Start()
    {
        dlgtTest d = Debug.Log;
        Action<object> a = Debug.Log;
    }

UnityのDebug.Logは引数を持ち、値を返しているわけではないのでDelegateに入れることができます。

あまり意味のないことですが知識として持っておくのは良いですね。

まとめ

Action<T>はDelegateの一種、分かってしまえばなんてことのないことでしたが、知らないときは謎の呪文でそれが邪魔をして本を読み進めるのが難しくなってしまうものです。

この記事が今回紹介した本の読者への補足となってくれれば幸いです。

ではまた次の記事で会いましょう!

コメント

タイトルとURLをコピーしました