トッカンソフトウェア

C# デレゲート、匿名メソッド、Func、Action、ラムダ式

今回は、デレゲート~ラムダ式をまとめてやります。

デレゲート

デレゲートはメソッドを別メソッドに割り当てます。
				
using System;

namespace ConsoleApplication1
{
    class Program
    {
        public delegate int Deleg(String str1, String str2);

        static void Main(string[] args)
        {
            Program pg = new Program();
            pg.exec();

            Console.Read();
        }

        public void exec()
        {
            // Deleg1にexecuteを割り当てる
            Deleg Deleg1 = new Deleg(execute);

            // Deleg1を実行しているが、実際はexecuteが実行される
            Deleg1("abc", "d");

            // newなしでも割り当てられる
            Deleg Deleg2 = execute;

            // 複数メソッドも割り当てられる
            Deleg2 += new Deleg(execute2);
            Deleg2("def", "g");
        }

        public int execute(String str1, String str2)
        {
            Console.Write(str1);
            return str2.Length;
        }
        public int execute2(String str1, String str2)
        {
            Console.Write(str2);
            return str1.Length;
        }
    }
}


			
実行結果

匿名メソッド

上記のデレゲートでは割り当てるメソッドを用意しましたが、匿名メソッドを使うと割り当て時に
メソッドを定義することができます。
				
using System;

namespace ConsoleApplication1
{
    class Program
    {
        public delegate int Deleg(String str1, String str2);

        static void Main(string[] args)
        {
            Program pg = new Program();
            pg.exec();

            Console.Read();
        }

        public void exec()
        {
            // Deleg1に匿名メソッドを割り当てる
            Deleg Deleg1 = new Deleg(delegate (string str1, String str2)
            {
                Console.Write(str1);
                return str2.Length;
            });

            // Deleg1に割り当てた匿名メソッドを実行
            Deleg1("abc", "d");

            // newなしでも割り当てられる
            Deleg Deleg2 = delegate (string str1, String str2)
            {
                Console.Write(str1);
                return str2.Length;
            };
            Deleg2("def", "g");
        }
    }
}


			

Func、Action

匿名メソッドでは割り当てるメソッドを省略できるようにしましたが、Func、Actionを使用すると割当先のメソッドの宣言も
省略できます。

Funcは戻り値あり、Actionは戻り値なしに使用します。
				
using System;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            Program pg = new Program();
            pg.exec();

            Console.Read();
        }

        public void exec()
        {
            // Deleg1に匿名メソッドを割り当てる
            Func<string, string, int> Deleg1 = delegate (string str1, string str2)
            {
                Console.Write(str1);
                return str2.Length;
            };

            // Deleg1に割り当てた匿名メソッドを実行
            Deleg1("abc", "d");

            // newなしでも割り当てられる
            Action <string, string> Deleg2 = delegate (string str1, string str2)
            {
                Console.Write(str1);
            };
            Deleg2("def", "g");
        }
    }
}


			

ラムダ式

ラムダ式を使用すると、delegete指定を省略することができ、また処理が1行の場合、returnも省略できます。
				
using System;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            Program pg = new Program();
            pg.exec();

            Console.Read();
        }

        public void exec()
        {
            // Deleg1に匿名メソッド(ラムダ式)を割り当てる
            Func<string, string, int> Deleg1 = (string str1, string str2) =>
            {
                Console.Write(str1);
                return str2.Length;
            };

            // Deleg1に割り当てた匿名メソッド(ラムダ式)を実行
            Deleg1("abc", "d");

            // 1行の処理の場合、波括弧も消せる、戻り値がある場合はreturnも消せる
            Func<string, string, int> Deleg2 = (string str1, string str2) => str1.Length + str2.Length;

            int ret = Deleg2("def", "g");
            Console.Write(ret);

        }
    }
}


			



ページのトップへ戻る