アプリケーションを設計するときに Func<> と Action<> をどのように使用しますか? 質問する

アプリケーションを設計するときに Func<> と Action<> をどのように使用しますか? 質問する

Func<>とAction<>について私が見つけた例はすべて単純下の写真のようにどうやって技術的には機能しますが、以前は解決できなかった問題や、より複雑な方法でしか解決できなかった問題を解決する例で使用されているのを見たいです。つまり、どのように機能するかを知っており、簡潔かつ力強いなので、私はそれらを理解したいのですより大きな意味それらがどのような問題を解決し、アプリケーションの設計にどのように活用できるのかを理解します。

実際の問題を解決するために、Func<> と Action<> をどのような方法 (パターン) で使用しますか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestFunc8282
{
    class Program
    {
        static void Main(string[] args)
        {
            //func with delegate
            Func<string, string> convert = delegate(string s)
            {
                return s.ToUpper();
            };

            //func with lambda
            Func<string, string> convert2 = s => s.Substring(3, 10);

            //action
            Action<int,string> recordIt = (i,title) =>
                {
                    Console.WriteLine("--- {0}:",title);
                    Console.WriteLine("Adding five to {0}:", i);
                    Console.WriteLine(i + 5);
                };

            Console.WriteLine(convert("This is the first test."));
            Console.WriteLine(convert2("This is the second test."));
            recordIt(5, "First one");
            recordIt(3, "Second one");

            Console.ReadLine();

        }
    }
}

ベストアンサー1

また、switch ステートメントのリファクタリングにも便利です。

次の(単純な)例を見てみましょう。

public void Move(int distance, Direction direction)
{
    switch (direction)
    {
        case Direction.Up :
            Position.Y += distance;
            break;
        case Direction.Down:
            Position.Y -= distance;
            break;
        case Direction.Left:
            Position.X -= distance;
            break;
        case Direction.Right:
            Position.X += distance;
            break;
    }
}

Action デリゲートを使用すると、次のようにリファクタリングできます。

static Something()
{
    _directionMap = new Dictionary<Direction, Action<Position, int>>
    {
        { Direction.Up,    (position, distance) => position.Y +=  distance },
        { Direction.Down,  (position, distance) => position.Y -=  distance },
        { Direction.Left,  (position, distance) => position.X -=  distance },
        { Direction.Right, (position, distance) => position.X +=  distance },
    };
}

public void Move(int distance, Direction direction)
{
    _directionMap[direction](this.Position, distance);
}

おすすめ記事