c# - 在设计应用程序时如何使用 Func<> 和 Action<>?

标签 c# delegates action anonymous-methods func

我能找到的关于 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();

        }
    }
}

最佳答案

它们对于重构 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 委托(delegate),您可以按如下方式重构它:

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);
}

关于c# - 在设计应用程序时如何使用 Func<> 和 Action<>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537404/

相关文章:

java - 如何在 jtable 的单元格内添加按钮并赋予它 Action

c# - C# Language Specification 是否明确规定比较必须是同一类型?

c# - 在 C++/CLI 中使用 EventHandler

c# - 查找字符串是否包含日期和时间

iphone - 每次从标签栏按下标签时如何执行方法?

asp.net-mvc - 在使用 [AllowAnonymous] 执行 Controller 中的 MVC 操作之前运行代码

c# - 为什么 XmlSerializer 不需要将类型标记为 [Serializable]?

swift - 在 TableView 中显示来自 UITableViewCell 的 UIAlertView

.net - 获取通过 lambda 表达式传递的方法名称?

java - getSource() 和 getActionCommand()