ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

続・マルチキャストデリゲート

プログラミングC# p316

マルチキャストデリゲートの戻り値はどうするかという問題。
昨日の無名メソッドの例を流用して、マルチキャストデリゲートの戻り値を表示してみる。

class FunctionPointer
{
        public delegate int twoitem(int a, int b);

        public static int add(int a, int b)
        {
                return a + b;
        }

        public static int sub(int a, int b)
        {
                return a - b;
        }

        static void Main(string[] args)
        {
                // 関数ポインタを定義
                FunctionPointer.twoitem fp;

                fp = FunctionPointer.add;

                fp += FunctionPointer.sub;

                fp += delegate(int a, int b)
                {
                        return a * b;
                };

                Console.WriteLine("result = {0}", fp(5, 3));
        }
}

結果はこう。

result = 15

どうやら、最後に実行されたメソッドの戻り値がそのまま返されるらしい。
つまり、最後に実行されたメソッド以外(ここではaddとsub)の戻り値が、このままでは活用できない。
そこで、デリゲートをばらばらに実行する方法というのがある。
それが、System.Delegate#getInvocationList。
特に意味はないが、この機能を使って各計算結果の合計(total)を算出してみる。

using System;

class FunctionPointer
{
        public delegate int twoitem(int a, int b);

        public static int add(int a, int b)
        {
                return a + b;
        }

        public static int sub(int a, int b)
        {
                return a - b;
        }

        static void Main(string[] args)
        {
                // 関数ポインタを定義
                FunctionPointer.twoitem fp;

                fp = FunctionPointer.add;

                fp += FunctionPointer.sub;

                fp += delegate(int a, int b)
                {
                        return a * b;
                };

                int total = 0;
                foreach(FunctionPointer.twoitem ptr in fp.GetInvocationList())
                {
                        int result = ptr(5, 3);
                        Console.WriteLine("result = {0}", result);

                        total += result;
                }

                Console.WriteLine("total = {0}", total);
        }
}

結果はこう。

result = 8
result = 2
result = 15
total = 25

個別のメソッドの戻り値、および、その合計を表示することが出来た。