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

在C#中,Action 和 Func 是系统内置的泛型委托类型,用于简化方法的传递和调用。它们常用于将方法作为参数传给其他方法,实现回调、事件处理、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# 代码。










