首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在设计应用程序时,如何使用Func<>和Action<>?

在设计应用程序时,如何使用Func<>和Action<>?
EN

Stack Overflow用户
提问于 2009-10-08 12:07:05
回答 9查看 31.8K关注 0票数 71

我能找到的关于Func<>和Action<>的所有例子都是simple,就像下面的例子,你可以看到它们是如何在技术上工作的,但我希望看到它们用于解决以前无法解决的问题或只能以更复杂的方式解决的问题,即我知道它们是如何工作的,我可以看到它们是简洁和强大的,所以我想从更广泛的意义上理解它们解决了什么类型的问题,以及如何在应用程序设计中使用它们。

您使用Func<>和Action<>以哪些方式(模式)来解决实际问题?

代码语言:javascript
复制
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();

        }
    }
}
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-10-08 15:12:42

它们对于重构switch语句也很方便。

举个例子(尽管很简单):

代码语言:javascript
复制
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代理,您可以按如下方式重构它:

代码语言:javascript
复制
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);
}
票数 57
EN

Stack Overflow用户

发布于 2009-10-08 12:09:52

使用linq.

代码语言:javascript
复制
List<int> list = { 1, 2, 3, 4 };

var even = list.Where(i => i % 2);

Where的参数是一个Func<int, bool>

Lambda表达式是我最喜欢的C#部分之一。:)

票数 15
EN

Stack Overflow用户

发布于 2009-10-08 13:59:48

我一直使用ActionFunc委托。我通常使用lambda语法声明它们,以节省空间,并主要用于减小大型方法的大小。当我回顾我的方法时,有时相似的代码段会脱颖而出。在这些情况下,我将类似的代码段包装到ActionFunc中。使用委托可以减少冗余代码,为代码段提供良好的签名,如果需要,可以很容易地将其提升为方法。

我曾经写过Delphi代码,你可以在一个函数中声明一个函数。在c#中,Action和Func为我实现了相同的行为。

下面是一个使用代理重新定位控件的示例:

代码语言:javascript
复制
private void Form1_Load(object sender, EventArgs e)
{
    //adjust control positions without delegate
    int left = 24;

    label1.Left = left;
    left += label1.Width + 24;

    button1.Left = left;
    left += button1.Width + 24;

    checkBox1.Left = left;
    left += checkBox1.Width + 24;

    //adjust control positions with delegate. better
    left = 24;
    Action<Control> moveLeft = c => 
    {
        c.Left = left;
        left += c.Width + 24; 
    };
    moveLeft(label1);
    moveLeft(button1);
    moveLeft(checkBox1);
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1537404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档