1. 理解C#委托的本质
在C#开发中,委托(delegate)是一个强大但常被初学者误解的概念。简单来说,委托就是类型安全的函数指针,它允许我们将方法作为参数传递,或者将方法存储在变量中。这种机制为C#带来了极大的灵活性,特别是在事件处理和回调场景中。
委托的核心价值在于它实现了方法的抽象和延迟执行。想象一下,你正在设计一个数据处理框架,其中某些处理步骤需要根据运行时条件动态变化。使用委托,你可以将这些可变的部分抽象出来,让调用者自行决定具体的实现方式。
重要提示:委托是C#事件机制的基础,理解委托是掌握C#高级特性的必经之路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Action、Func和Predicate委托详解
2.1 Action委托:无返回值的操作
Action委托是最简单的委托类型,它表示一个没有返回值的方法。在System命名空间中,微软为我们定义了一系列泛型Action委托,从Action(无参数)到Action<in T1, in T2, ..., in T16>(最多16个参数)。
csharp复制// 基本用法示例
Action greet = () => Console.WriteLine("Hello, World!");
greet(); // 输出: Hello, World!
Action<string, int> printDetails = (name, age) =>
{
Console.WriteLine($"Name: {name}");
Console.WriteLine($"Age: {age}");
};
printDetails("Alice", 30);
在实际项目中,Action常用于:
- UI事件处理(如按钮点击)
- 后台任务完成后的回调
- 需要延迟执行的操作
2.2 Func委托:有返回值的函数
Func委托与Action类似,但关键区别在于它有返回值。Func系列的最后一个泛型参数总是表示返回类型。例如,Func<int, string>表示接受一个int参数并返回string的方法。
csharp复制// 计算平方的Func
Func<int, int> square = x => x * x;
int result = square(5); // 25
// 更复杂的例子:字符串处理
Func<string, string, string> combineStrings = (s1, s2) => $"{s1} {s2}";
string combined = combineStrings("Hello", "Func"); // "Hello Func"
Func在以下场景特别有用:
- LINQ查询中的选择器
- 需要返回值的回调函数
- 需要组合多个操作的数据处理管道
2.3 Predicate委托:返回bool的判断
Predicate
code复制
