在什么情况下需要使用Action作为参数

本文关键字:参数 Action 情况下 在什么 | 更新日期: 2023-09-27 18:11:01

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

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

在什么情况下需要使用Action<T>作为参数

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

void LongRunningOperation(Action<float> progress)
{
    for (int i = 0; i < lotsOfIterations; ++i)
    {
        SlowCalculation();
        progress(((float)i / lotsOfIterations) * 100);
    }
}
当然,您也可以使用事件来实现这一点,但是这样很容易看到回调与该方法相关。如果你有一个大的类,你可能不希望仅仅为一个方法添加另一个事件。

另一个例子可能是,如果您希望允许调用者改变操作的每个值。为此,您可以使用Func<>,它类似于Action,但返回一个值:

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

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);
    }

在没有返回值的简单操作中使用