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

来源:这里教程网 时间:2026-02-21 17:31:11 作者:

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

什么是 Action?

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

常见形式:

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

示例:

void SayHello()
{
    Console.WriteLine("Hello");
}
<p>void Greet(string name)
{
Console.WriteLine($"Hello, {name}");
}</p><p>// 使用 Action 调用无参方法
Action action1 = SayHello;
action1(); // 输出: Hello</p><p>// 使用 Action<string> 调用带参方法
Action<string> action2 = Greet;
action2("Alice"); // 输出: Hello, Alice

什么是 Func?

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

常见形式:

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

示例:

int GetNumber()
{
    return 42;
}
<p>string GetName(int id)
{
return id == 1 ? "Tom" : "Unknown";
}</p><p>// 使用 Func<int> 接收无参但有返回值的方法
Func<int> func1 = GetNumber;
int number = func1(); // number = 42</p><p>// 使用 Func<int, string> 接收带参并返回字符串的方法
Func<int, string> func2 = GetName;
string name = func2(1); // name = "Tom"

如何使用它们传递方法?

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

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

void ExecuteAction(Action action)
{
    Console.WriteLine("开始执行...");
    action();
    Console.WriteLine("执行结束。");
}
<p>int ExecuteFunc(Func<int> func)
{
Console.WriteLine("开始计算...");
int result = func();
Console.WriteLine("计算完成。");
return result;
}

调用示例:

ExecuteAction(SayHello);
// 输出:
// 开始执行...
// Hello
// 执行结束。
<p>int result = ExecuteFunc(GetNumber);
// 输出:
// 开始计算...
// 计算完成。

Lambda 表达式写法更简洁:

ExecuteAction(() => Console.WriteLine("内联消息"));
<p>int square = ExecuteFunc(() => 5 * 5); // 返回 25

小结

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

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

相关推荐

热文推荐