デリゲートって分かりづらいし、どんな時に使えばいいんだってなるよね。


たとえば、1から1000までを足して値を表示、引いて値を表示する際に
ゴリゴリに書くと以下のようになります。

        static void Main(string[] args)
        {
            int sum = 0;
            for (int i = 1; i <= 1000; i++)
            {
                sum += i;
            }

            Console.WriteLine(sum);

            sum = 0;
            for (int i = 1; i <= 1000; i++)
            {
                sum -= i;
            }

            Console.WriteLine(sum);

            Console.ReadKey();
        }

この繰り返し処理で枠は同じで
sum +=i とsum-=i
の部分を差し替えられるとうれしいですよね?

ということで

        delegate void Calculation(ref int sum, int i);

        private void Calc(Calculation calculation)
        {
            int sum = 0;

            for (int i = 1; i <= 1000; i++)
            {
                calculation(ref sum, i);
            }

            Console.WriteLine(sum);
        }

        static void Main(string[] args)
        {
            var program = new Program();
            program.Calc((ref int sum, int i) => sum += i);
            program.Calc((ref int sum, int i) => sum -= i);

            Console.ReadKey();
        }