c#内置委托Action、Func、Predicate
在 C# 中,内置的委托类型主要存在于 System 命名空间以及后续版本引入的更多泛型委托中。这些委托极大地简化了代码,尤其是在使用 Lambda 表达式和 LINQ 时。
现代泛型委托 (C# 2.0 及以后)
C# 2.0 引入了泛型,随之诞生了一系列强大的内置泛型委托,它们成为了现代 C# 编程的基石。
1. Action系列委托
用于表示没有返回值的方法(void 方法)。
托 | 签名 | 对应 Lambda 表达式类型 |
Action | void Method() | () => { ... } |
Action<T> | void Method(T obj) | (x) => { ... } 或 x => { ... } |
Action<T1, T2> | void Method(T1 arg1, T2 arg2) | (x, y) => { ... } |
Action<T1, T2, T3> | void Method(T1 arg1, T2 arg2, T3 arg3) | (x, y, z) => { ... } |
... | ... | ... |
Action<T1, ..., T16> | void Method(T1 arg1, ..., T16 arg16) | 最多支持 16 个输入参数 |
示例:
// 使用 Action<string> 委托表示一个接受 string 参数的 void 方法
Action<string> logHandler = (message) => Console.WriteLine(#34;Log: {message}");
logHandler("Hello, Action!"); // 输出: Log: Hello, Action!2. Func系列委托
用于表示有返回值的方法。
委托 | 签名 | 对应 Lambda 表达式类型 |
Func<TResult> | TResult Method() | () => ... (返回一个值) |
Func<T, TResult> | TResult Method(T obj) | x => ... (返回一个值) |
Func<T1, T2, TResult> | TResult Method(T1 arg1, T2 arg2) | (x, y) => ... (返回一个值) |
... | ... | ... |
Func<T1, ..., T16, TResult> | TResult Method(T1 arg1, ..., T16 arg16) | 最多支持 16 个输入参数,最后一个泛型参数 TResult 总是返回值类型 |
示例:
// 使用 Func<int, int, int> 委托表示一个接受两个 int 参数并返回 int 的方法
Func<int, int, int> add = (a, b) => a + b;
int result = add(5, 3); // result = 8
// 在 LINQ 中广泛使用
var numbers = new List<int> { 1, 2, 3, 4 };
var squaredNumbers = numbers.Select(x => x * x); // .Select 方法接收一个 Func<int, TResult>3.Predicate<T>委托
用于表示一个定义一组条件并判断指定对象是否符合这些条件的方法。它总是返回一个 bool。
委托 | 签名 | 说明 |
Predicate<T> | bool Method(T obj) | 表示一个接收 T 类型参数并返回 bool 的方法。 |
示例:
// 使用 Predicate<int> 判断数字是否为偶数
Predicate<int> isEven = (x) => x % 2 == 0;
bool result = isEven(4); // true
// 常用于 List<T> 的方法中,如 FindAll, RemoveAll
List<int> list = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenList = list.FindAll(isEven); // 返回包含 2, 4, 6 的新列表注意:Predicate<T> 在功能上完全等同于 Func<T, bool>。.NET 中一些旧的 API(如 List<T>.FindAll)使用 Predicate<T>,而更新的 API(如 LINQ 的 Where)则使用 Func<T, bool>。在你自己编写代码时,通常更推荐使用 Func<T, bool> 以保持一致性。
下一篇再介绍常用于处理事件的内置委托 EventHandler。