C# 委托(delegate)核心概念:Action 与 Func 的使用指南

周末不加班
周末不加班
发布时间:2026-10-14 | 5人浏览过
原创

C# 中的委托(delegate)本质上是类型安全的函数指针,允许将方法作为参数传递。与 JavaScript 灵活的对象属性不同,C# 需要明确的类型声明。本文将解析如何利用系统内置的 Action 和 Func 泛型委托,简化传统 delegate 冗长的定义流程,并展示其在匿名方法调用及闭包变量捕获中的实际应用。

理解 C# 委托的本质

在 C# 开发中,经常遇到需要将“一个函数”作为参数传递给另一个函数的情况。虽然 JavaScript 可以自然地传递函数引用,但 C# 是强类型语言,必须为这些可执行单元定义明确的类型——这就是委托。

简单来说,委托定义了方法的签名(返回类型和参数列表)。调用时传入的必须是与该签名匹配的方法。

使用内置泛型委托:Action 与 Func

在实际开发中,很少手动编写 public delegate void ...。现代 C# 提供了两个最常用的通用委托:System.Action 和 System.Func。

第 1 步:理解 Action(无返回值)

Action 用于表示没有返回值(void)的方法。它支持最多 16 个输入参数。

  • 语法格式:Action<T1, T2, ...>
  • 特点:最后一个泛型参数是参数类型,整体约定返回类型为 void。

第 2 步:理解 Func(有返回值)

Func 用于表示有返回值的方法。其关键规则是:**最后一个**泛型参数代表返回值类型,前面的所有参数代表输入参数。

  • 语法格式:Func<T1, T2, ..., TResult>
  • 示例:Func<string, Int32> 表示一个接收 string 参数并返回 Int32 的方法。

第 3 步:定义接收委托的方法

我们可以创建一个方法,通过这两个内置类型来接收外部传入的逻辑:

public void ProcessData(Action voidMethod, Func returnMethod)
{
    // voidMethod("Hello") 将被调用且无返回值
    // int result = returnMethod("World"); 将被调用并获取返回值
}

传统方式与现代匿名方法的对比

虽然可以使用 Action 和 Func,但在调用方式上分为“匿名方法”和“命名方法绑定”。以下分别演示两种模式。

第 4 步:使用匿名委托 (Anonymous Methods)

这是最接近 JavaScript 写法的方式,直接在调用处定义逻辑。适用于逻辑简单、不需要复用的场景。

// 直接传入 lambda 或 anonymous delegate
ProcessData(
    delegate(string text) { Console.WriteLine(text); }, 
    delegate(string text) { return text.Length; }
);

第 5 步:传统命名方法与委托实例化

如果业务逻辑复杂,建议先在类中定义明确的方法,再将其赋值给委托变量。这种方式更利于维护和单元测试。

public static class LogicHelper
{
    public static void HandleMessage(string msg) {
        Console.WriteLine($"Received: {msg}");
    }
    public static int CountChars(string str) {
        return str.Length;
    }
}

// 调用时
LogicHelper.HandleMessage, 
LogicHelper.CountChars);

注意事项与常见问题

  • 类型安全: C# 要求签名完全匹配。例如,不能将一个返回 double 的方法赋值给 Func,除非存在隐式转换。
  • 性能差异: 委托调用相比直接方法调用略有开销(涉及栈帧跳转),但在大多数业务场景中可忽略不计。
  • 与 JS 的区别: JS 是动态类型,C# 必须在编译期确定委托指向的具体方法集合,这避免了运行时的“找不到函数”错误。

以上就是 C# 委托(delegate)在 Action 与 Func 下的应用解析,更多关于 C# 高级特性如 Lambda 表达式、事件模型与异步编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表