C# 委托(delegate)核心概念:Action 与 Func 的使用指南
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 表达式、事件模型与异步编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













