我能找到的关于Func<>和Action<>的所有例子都是simple,就像下面的例子,你可以看到它们是如何在技术上工作的,但我希望看到它们用于解决以前无法解决的问题或只能以更复杂的方式解决的问题,即我知道它们是如何工作的,我可以看到它们是简洁和强大的,所以我想从更广泛的意义上理解它们解决了什么类型的问题,以及如何在应用程序设计中使用它们。
您使用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();
}
}
}
发布于 2009-10-08 15:12:42
它们对于重构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);
}
发布于 2009-10-08 12:09:52
使用linq.
List<int> list = { 1, 2, 3, 4 };
var even = list.Where(i => i % 2);
Where
的参数是一个Func<int, bool>
。
Lambda表达式是我最喜欢的C#部分之一。:)
发布于 2009-10-08 13:59:48
我一直使用Action
和Func
委托。我通常使用lambda语法声明它们,以节省空间,并主要用于减小大型方法的大小。当我回顾我的方法时,有时相似的代码段会脱颖而出。在这些情况下,我将类似的代码段包装到Action
或Func
中。使用委托可以减少冗余代码,为代码段提供良好的签名,如果需要,可以很容易地将其提升为方法。
我曾经写过Delphi代码,你可以在一个函数中声明一个函数。在c#中,Action和Func为我实现了相同的行为。
下面是一个使用代理重新定位控件的示例:
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);
}
https://stackoverflow.com/questions/1537404
复制相似问题