.NET C#中的Func、Predicate和Expression用法详解
在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。
1. Func
Func 是一个通用委托,用于表示返回值类型的函数。可以有 0 到 16 个输入参数,最后一个类型参数是返回值的类型。
Func 基本语法
public delegate TResult Func
T1, T2... 是输入参数的类型。TResult 是返回值的类型。
Func 用法示例
无参数的 Func
Func
Console.WriteLine(getRandomNumber()); // 输出随机数
一个输入参数
Func
Console.WriteLine(square(5)); // 输出 25
多个输入参数
Func
Console.WriteLine(add(3, 4)); // 输出 7
2. Predicate
Predicate
Predicate 基本语法
public delegate bool Predicate
T 是输入参数的类型。返回值为 bool。
Predicate 用法示例
检查是否为偶数
Predicate
Console.WriteLine(isEven(4)); // 输出 True
Console.WriteLine(isEven(5)); // 输出 False
结合 List 使用
var numbers = new List
var evenNumbers = numbers.FindAll(x => x % 2 == 0);
Console.WriteLine(string.Join(", ", evenNumbers)); // 输出 2, 4
3. Expression
Expression
Expression 基本语法
public class Expression
TDelegate 是委托类型,如 Func 或 Predicate。可以用于构建动态查询或生成代码。
Expression 用法示例
创建简单的表达式树
Expression
Console.WriteLine(squareExpression); // 输出 x => (x * x)
编译并执行表达式树
var compiled = squareExpression.Compile();
Console.WriteLine(compiled(5)); // 输出 25
动态构建查询
Expression
var compiledPredicate = isEvenExpression.Compile();
Console.WriteLine(compiledPredicate(4)); // 输出 True
Console.WriteLine(compiledPredicate(5)); // 输出 False
与 LINQ 一起使用
在 ORM(如 Entity Framework)中,Expression 是非常关键的,用于动态生成 SQL 查询。
Expression
var activeUsers = dbContext.Users.Where(isActiveUser).ToList();
比较和区别
总结
Func 是最通用的委托类型,用于定义任何返回值的函数。
Predicate 是 Func
Expression 不直接执行,而是用于描述代码结构,主要应用于 LINQ 和动态编译场景。
选择哪种工具取决于需求:
如果需要快速执行,使用 Func 或 Predicate。
如果需要动态生成或操作表达式,使用 Expression。