2011-10-12 33 views
2

我知道使用Action作为方法参数将允许使用该方法的lambda表达式,但是在LOB应用程序/ Web应用程序中需要使用哪种情况(或者想使用它)会出现什么样的情况?我相信LINQ会大量使用它,但我不明白如何在自己的代码中使用它,而不会使事情变得笨拙或不必要的复杂。什么情况下需要使用动作<T>作为参数?

是否需要将Action作为方法参数经常出现,而我只是无法看到它(还)还是在LOB应用程序中很少使用的东西?

+0

查看[Parallel](http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.aspx)类中的TPL和方法。有时候你只需要一个能够做某事但不一定返回任何内容的委托。 –

+0

我在Func的问题中看不到任何提及,所以我不认为OP是关心Action是否返回的问题。 – Grokys

回答

4

一个例子是,如果你有一个长期运行的操作,并要提供进度反馈给用户:

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) 
    } 
} 
+0

啊,这是有道理的。 –

2

只要您有简单的操作即可执行无返回值的任何操作。

测井是一个很好的例子。

+0

你介意提供某种样品代码吗?我只是很难想象这个例子的代码会是什么样子。 – Jetti

+0

我不认为这真的解决了这个问题。 – Grokys

4

行动仅仅是返回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); 
    } 

这也行。

+0

固定,哎呀输入得太快;)谢谢@KirkWoll –

+1

其实你的连续编辑都是合法的,实际上是一个微妙点的很好的示范。即'myList.ForEach(Console.WriteLine)'和'myList.ForEach(s => Console.WriteLine(s))'都是有效的,后者涉及额外的间接性(虽然更容易阅读我的眼睛)。 –

相关问题