C# Action和Func的区别 - 通用委托的实际应用

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

ActionFunc 是 C# 中两个常用的泛型委托,它们都用于封装方法,但用途和结构不同。理解它们的区别并掌握实际应用场景,有助于写出更简洁、可维护的代码。

基本定义与返回值差异

Action 和 Func 最核心的区别在于是否具有返回值:

Action 代表一个接受一个参数(类型为 T)且没有返回值的委托,即返回类型为 void Func 代表一个接受一个参数(类型为 T)并返回指定类型(TResult)结果的委托。

例如:

Action print = s => Console.WriteLine(s);
print("Hello"); // 输出:Hello


Func square = x => x * x;
int result = square(5); // result = 25

常见使用场景对比

两者在实际开发中广泛应用于事件处理、集合操作、依赖注入等场景。

Action 的典型应用:

执行某种操作而不关心结果,比如日志记录、消息通知。 作为回调函数传递给其他方法,例如集合遍历中的 List.ForEach(action) var names = new List { "Alice", "Bob" };
names.ForEach(name => Console.WriteLine($"Hello, {name}"));


Func 的典型应用:

需要对输入进行转换或计算后返回结果,比如数据映射、条件判断。 LINQ 查询中大量使用 Func,如 WhereSelect 等。 var numbers = new List { 1, 2, 3, 4 };
var squares = numbers.Select(x => x * x).ToList(); // 使用 Func

灵活应对多参数情况

这两个委托都有多个泛型重载版本:

Action 支持最多 16 个参数的重载(如 Action),但始终无返回值。 Func 同样支持多个输入参数,最后一个类型参数始终是返回类型,例如 Func 表示两个 int 输入,返回 bool。

例如:

Action logEntry = (msg, level) => Console.WriteLine($"[{level}] {msg}");
logEntry("Error occurred", 3);


Func formatMsg = (s, n) => $"{s}: {n} times";
string output = formatMsg("Clicked", 5); // "Clicked: 5 times"

在自定义方法中使用委托提升灵活性

将 Action 或 Func 作为参数传入方法,可以实现行为的动态注入,增强代码复用性。

void ProcessData(List data, Action onItemProcessed, Func filter)
{
    foreach (var item in data)
    {
        if (filter(item))
        {
            onItemProcessed(item);
        }
    }
}


调用时可根据需要传入不同的逻辑:

ProcessData(numbers,
    item => Console.WriteLine($"Processing {item}"),
    x => x % 2 == 0 // 只处理偶数 );

基本上就这些。Action 适合“做点事”,Func 适合“算个结果”。合理选用能让代码更清晰、更具扩展性。

相关推荐