C#的Action和Func委托是什么?如何使用它们传递方法?

Action用于无返回值方法传递,Func用于有返回值方法传递;二者均支持0-16个参数,可结合Lambda表达式使用,广泛应用于回调、LINQ查询等场景,提升代码可读性与扩展性。

在C#中,ActionFunc 是系统内置的泛型委托类型,用于简化方法的传递和调用。它们常用于将方法作为参数传给其他方法,实现回调、事件处理、LINQ 查询等场景。

什么是 Action?

Action 是一个表示无返回值方法的委托。它可以接受 0 到 16 个输入参数。

常见形式:

  • Action:无参数,无返回值
  • Action:一个参数,无返回值
  • Action:两个参数,无返回值

示例:

void SayHello()
{
    Console.WriteLine("Hello");
}

void Greet(string name) { Console.WriteLine($"Hello, {name}"); }

// 使用 Action 调用无参方法 Action action1 = SayHello; action1(); // 输出: Hello

// 使用 Action 调用带参方法 Action action2 = Greet; action2("Alice"); // 输出: Hello, Alice

什么是 Func?

Func 是一个有返回值的泛型委托。它至少有一个参数是返回类型(最后一个),最多支持 16 个输入参数加一个返回值。

常见形式:

  • Func:无输入参数,返回 TResult
  • Func:一个输入参数,返回 TResult
  • Func:两个输入参数,返回 TResult

示例:

int GetNumber()
{
    return 42;
}

string GetName(int id) { return id == 1 ? "Tom" : "Unknown"; }

// 使用 Func 接收无参但有返回值的方法 Func func1 = GetNumber; int number = func1(); // number = 42

// 使用 Func 接收带参并返回字符串的方法 Func func2 = GetName; string name = func2(1); // name = "Tom"

如何使用它们传递方法?

你可以把普通方法、匿名方法、Lambda 表达式赋值给 Action 或 Func。

实际应用场景示例:定义一个通用执行器方法

void ExecuteAction(Action action)
{
    Console.WriteLine("开始执行...");
    action();
    Console.WriteLine("执行结束。");
}

int ExecuteFunc(Func func) { Console.WriteLine("开始计算..."); int result = func(); Console.WriteLine("计算完成。"); return result; }

调用示例:

ExecuteAction(SayHello);
// 输出:
// 开始执行...
// Hello
// 执行结束。

int result = ExecuteFunc(GetNumber); // 输出: // 开始计算... // 计算完成。

Lambda 表达式写法更简洁:

ExecuteAction(() => Console.WriteLine("内联消息"));

int square = ExecuteFunc(() => 5 * 5); // 返回 25

小结

Action 用于没有返回值的方法传递,Func 用于有返回值的方法传递。两者都支持多种参数数量,结合 Lambda 使用非常灵活。它们让代码更具可扩展性和可读性,尤其是在需要“把方法当参数”的场合,比如集合操作、异步编程、依赖注入等。

基本上就这些,掌握它们能让你写出更简洁、函数式风格的 C# 代码。