什么情况可以使用Action <t>作为参数?</t>

时间:2011-10-12 21:10:37

标签: c#

我知道使用Action作为方法参数将允许在该方法中使用lambdas,但是在LOB应用程序/ Web应用程序中需要使用它(或想要使用它)会出现什么样的情况?我相信LINQ大量使用它,但我无法看到如何在我自己的代码中使用它而不会使事情变得尴尬或不必要的复杂。

是否需要经常使用Action作为方法参数,而我还是看不到(或者)它是否在LOB应用程序中很少使用?

3 个答案:

答案 0 :(得分:4)

一个例子是,如果您有长时间运行的操作,并且想要向用户提供进度反馈:

void LongRunningOperation(Action<float> progress)
{
    for (int i = 0; i < lotsOfIterations; ++i)
    {
        SlowCalculation();
        progress(((float)i / lotsOfIterations) * 100);
    }
}

当然,您也可以使用事件来执行此操作,但这样很容易看出回调与此方法有关。如果你有一个大班,你可能不想只为一个方法添加另一个事件。

另一个示例可能是您希望允许调用者改变操作的每个值。为此你要使用Func&lt;&gt;这类似于Action但返回一个值:

void Operation(Func<int, int> mutate)
{
    for (int i in someCollection)
    {
        i = mutate(i);
        SomeCalculation(i)
    }
}

答案 1 :(得分:4)

Action只是一个返回void的委托。

您可以在要委派代码执行的许多地方使用它。

我想一个简单的例子就是你有一个列表要显示它的所有数据。

你可以写

for(...)
{
    Console.WriteLine(...);
}

但是使用Action,像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);
}

因此,Action可能不是Linq,而只是指向返回void的方法的指针,并将其作为T类型的参数。

    List<string> myList= new List<string>(){ "ABC", "DEF", "H" };
    myList.ForEach(Print);
    public void Print(string s)
    {
        Console.WriteLine(s);
    }

这也有效。

答案 2 :(得分:2)

在没有返回值的简单操作的任何地方使用它。

记录就是一个很好的例子。