跳到主要内容

C# Func 委托

介绍

在 C# 中,委托(Delegate)是一种类型安全的函数指针,允许你将方法作为参数传递或存储。Func 委托是 C# 中预定义的一种泛型委托,它可以表示带有返回值的方法。Func 委托的最后一个泛型参数表示返回值类型,而前面的参数表示方法的输入参数。

Func 委托的签名如下:

csharp
public delegate TResult Func<in T1, in T2, ..., out TResult>(T1 arg1, T2 arg2, ...);

其中,T1, T2, ... 是输入参数的类型,TResult 是返回值的类型。

基本用法

1. 无参数的 Func 委托

最简单的 Func 委托是没有输入参数,只有返回值的委托。例如:

csharp
Func<int> getRandomNumber = () => new Random().Next(1, 100);
int number = getRandomNumber();
Console.WriteLine(number); // 输出:1 到 100 之间的随机数

在这个例子中,getRandomNumber 是一个没有输入参数并返回 int 类型的 Func 委托。

2. 带参数的 Func 委托

Func 委托也可以接受多个输入参数。例如:

csharp
Func<int, int, int> add = (a, b) => a + b;
int result = add(3, 5);
Console.WriteLine(result); // 输出:8

在这个例子中,add 是一个接受两个 int 类型参数并返回 int 类型的 Func 委托。

实际应用场景

1. 作为方法参数

Func 委托常用于将方法作为参数传递给其他方法。例如,假设我们有一个方法 ProcessNumbers,它接受一个 Func<int, int> 委托作为参数:

csharp
void ProcessNumbers(int[] numbers, Func<int, int> operation)
{
for (int i = 0; i < numbers.Length; i++)
{
numbers[i] = operation(numbers[i]);
}
}

int[] numbers = { 1, 2, 3, 4, 5 };
ProcessNumbers(numbers, x => x * 2);
Console.WriteLine(string.Join(", ", numbers)); // 输出:2, 4, 6, 8, 10

在这个例子中,ProcessNumbers 方法接受一个 Func<int, int> 委托,并将其应用于数组中的每个元素。

2. 在 LINQ 中使用

Func 委托在 LINQ 查询中也非常常见。例如:

csharp
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
Console.WriteLine(string.Join(", ", evenNumbers)); // 输出:2, 4

在这个例子中,Where 方法接受一个 Func<int, bool> 委托,用于过滤列表中的元素。

总结

Func 委托是 C# 中非常强大的工具,它允许你将方法作为参数传递,从而实现更灵活的编程模式。通过使用 Func 委托,你可以简化代码并提高代码的可重用性。

提示

小提示Func 委托最多可以接受 16 个输入参数。如果需要更多的参数,可以考虑使用自定义委托或重构代码。

附加资源与练习

  1. 练习:尝试创建一个 Func 委托,接受两个字符串作为输入参数,并返回它们的连接结果。
  2. 进一步学习:了解 Action 委托,它与 Func 委托类似,但没有返回值。

通过掌握 Func 委托,你将能够编写更加灵活和强大的 C# 代码。继续练习并探索更多高级用法吧!