systembankスタッフのブログ

システムバンクスタッフのブログです。

ラムダ式への道 その4 到着

 アクションとファンクション

.Net Frameworkのライブラリにあらかじめ用意されているdelegateにアクション(Action)とファンクション(Func)があります。

それぞれこんな感じで使用します。

    class SomeClass
    {
        private Func<int, string> _someFunction;
        public SomeClass(Func<int, string> function)
        {
            _someFunction = function;
        }

        public string DoSomething(int value)
        {
            return _someFunction(value);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var some = new SomeClass((v) => (v * v).ToString());
        
            var value = 10;
            Console.WriteLine(some.DoSomething(value));
        }
    }    

前回のサンプルコードのdelegate宣言をFuncに置き換えました。Func<int, string>でintが引数型、stringが返却型の関数を表しています。

引数が無い場合は

        Func now = () => DateTime.Now.ToString();
        var s = now();

引数部分を()と書いた後にラムダ演算子になります。

先のプログラムをActionを使用する形に変更してみます

    class SomeClass
    {
        private Action _someAction;
        public SomeClass(Action action)
        {
            _someAction = action;
        }

        public void DoSomething(int value)
        {
            _someAction(value);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var some = new SomeClass((v) => Console.WriteLine((v * v).ToString()));
        
            var value = 10;
            some.DoSomething(value);
        }
    }

アクション、ファンクションは引数が4つまで用意されています。 また引数にC# 7.0で導入されたタプルを使用できるので、それを引数に利用するとdelegateを 新たに作成する必要はほどんどないかと思います。