我知道使用Action作为方法参数将允许使用该方法的lambda表达式,但是在LOB应用程序/ Web应用程序中需要使用哪种情况(或者想使用它)会出现什么样的情况?我相信LINQ会大量使用它,但我不明白如何在自己的代码中使用它,而不会使事情变得笨拙或不必要的复杂。什么情况下需要使用动作<T>作为参数?
是否需要将Action作为方法参数经常出现,而我只是无法看到它(还)还是在LOB应用程序中很少使用的东西?
我知道使用Action作为方法参数将允许使用该方法的lambda表达式,但是在LOB应用程序/ Web应用程序中需要使用哪种情况(或者想使用它)会出现什么样的情况?我相信LINQ会大量使用它,但我不明白如何在自己的代码中使用它,而不会使事情变得笨拙或不必要的复杂。什么情况下需要使用动作<T>作为参数?
是否需要将Action作为方法参数经常出现,而我只是无法看到它(还)还是在LOB应用程序中很少使用的东西?
一个例子是,如果你有一个长期运行的操作,并要提供进度反馈给用户:
void LongRunningOperation(Action<float> progress)
{
for (int i = 0; i < lotsOfIterations; ++i)
{
SlowCalculation();
progress(((float)i/lotsOfIterations) * 100);
}
}
当然,你也可以做到这一点使用事件,但这种方式很容易看到回调涉及这种方法。如果你有一个大班,你可能不想为一种方法添加另一个事件。
另一个例子可能是如果你想允许调用者改变操作的每个值。对于这一点,你会使用Func键<>这是类似的行动,但返回的值:
void Operation(Func<int, int> mutate)
{
for (int i in someCollection)
{
i = mutate(i);
SomeCalculation(i)
}
}
啊,这是有道理的。 –
行动仅仅是返回void的委托。
您可以在许多地方将其用于代表执行代码的位置。
我认为一个简单的例子是如果你有一个列表,你想显示它的所有数据。
你可以写
for(...)
{
Console.WriteLine(...);
}
但随着行动,喜欢的ForEach方法采取这种委托作为参数,让你做的事:
myList.ForEach(s=>Console.WriteLine(s));
事实上,给ForEach使用Action作为参数,让你参考一个委托方法:
public void Each<T>(IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
action(item);
}
所以,行动可能不是Linq而只是一个指向返回void的方法的指针,并且它将T参数作为参数。
List<string> myList= new List<string>(){ "ABC", "DEF", "H" };
myList.ForEach(Print);
public void Print(string s)
{
Console.WriteLine(s);
}
这也行。
固定,哎呀输入得太快;)谢谢@KirkWoll –
其实你的连续编辑都是合法的,实际上是一个微妙点的很好的示范。即'myList.ForEach(Console.WriteLine)'和'myList.ForEach(s => Console.WriteLine(s))'都是有效的,后者涉及额外的间接性(虽然更容易阅读我的眼睛)。 –
查看[Parallel](http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.aspx)类中的TPL和方法。有时候你只需要一个能够做某事但不一定返回任何内容的委托。 –
我在Func的问题中看不到任何提及,所以我不认为OP是关心Action是否返回的问题。 – Grokys