C# 中Func 的用法
在 C# 中,Func 是一个泛型委托类型,用于表示有返回值的方法,它是 .NET 框架提供的预定义委托,无需手动声明即可直接使用。Func 的核心作用是封装具有特定参数列表和返回值的方法,常用于 lambda 表达式、匿名方法或作为方法参数传递,使代码更简洁灵活。
一、基本定义与语法
Func 是泛型委托,定义格式为:
Func<参数类型1, 参数类型2, ..., 返回值类型>
-
特点
- 最少需要指定返回值类型(即至少有 1 个类型参数,代表返回值)。
- 最多可以有 16 个输入参数 + 1 个返回值类型(共 17 个类型参数)。
- 无参数但有返回值时,使用 Func<返回值类型>。
二、常用形式与示例
- 无参数,有返回值(Func)
// 定义:无参数,返回string
Func<string> getTime = () => DateTime.Now.ToString("HH:mm:ss");
// 调用
string currentTime = getTime(); // 结果:当前时间字符串,如 "15:30:20"
- 1 个参数,有返回值(Func<T, TResult>)
// 定义:输入int,返回其平方(int)
Func<int, int> square = x => x * x;
// 调用
int result = square(5); // 结果:25
- 2 个参数,有返回值(Func<T1, T2, TResult>)
// 定义:输入两个string,返回拼接结果
Func<string, string, string> combine = (a, b) => $"{a}-{b}";
// 调用
string str = combine("Hello", "World"); // 结果:"Hello-World"
- 多参数(如 3 个参数)
// 定义:输入三个int,返回它们的和
Func<int, int, int, int> sum = (a, b, c) => a + b + c;
// 调用
int total = sum(1, 2, 3); // 结果:6
三、Func 的典型用法
- 作为方法参数(传递逻辑)
将 Func 作为参数传入方法,使方法可以动态执行不同逻辑,类似 “回调函数”。
// 定义一个使用Func的方法:对数组中的每个元素执行func逻辑并返回新数组
int[] ProcessArray(int[] array, Func<int, int> func)
{
int[] result = new int[array.Length];
for (int i = 0; i < array.Length; i++)
{
result[i] = func(array[i]); // 执行传入的逻辑
}
return result;
}
// 使用:传入不同的Func实现不同功能
int[] numbers = { 1, 2, 3, 4 };
int[] squares = ProcessArray(numbers, x => x * x); // 求平方:[1,4,9,16]
int[] doubles = ProcessArray(numbers, x => x * 2); // 翻倍:[2,4,6,8]
- 配合 LINQ 查询
LINQ 中大量使用 Func 作为参数,例如 Where、Select 等方法:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// Where方法接收Func<int, bool>:筛选出偶数
var evenNumbers = numbers.Where(n => n % 2 == 0); // 结果:[2,4]
// Select方法接收Func<int, string>:转换为字符串
var numberStrings = numbers.Select(n => $"数字:{n}"); // 结果:["数字:1", "数字:2", ...]
- 简化复杂逻辑的封装
当需要多次复用某段逻辑时,用 Func 封装可减少代码冗余:
// 封装“字符串处理”逻辑
Func<string, string, string> processString = (input, suffix) =>
{
if (string.IsNullOrEmpty(input))
return "默认值";
return input.Trim() + suffix;
};
// 多次复用
string res1 = processString(" test ", "123"); // 结果:"test123"
string res2 = processString(null, "456"); // 结果:"默认值456"
四、Func 与 Action 的区别
1.Func:有返回值(至少需要指定返回值类型)。
2. Action:无返回值(专注于执行操作,参数列表与 Func 类似,但无返回值类型)。
示例对比:
// Func(有返回值)
Func<int, int> addOne = x => x + 1;
// Action(无返回值)
Action<int> printNumber = x => Console.WriteLine(x);
五、总结
Func 是 C# 中处理 “有返回值的方法封装” 的强大工具,其核心优势在于:
- 简化代码:无需手动声明委托类型,直接使用预定义的 Func。
- 灵活传递逻辑:作为参数传递时,可动态切换方法行为(如 LINQ、回调函数)。
- 配合 lambda 表达式:使代码更简洁,可读性更高。
掌握 Func 的用法,能极大提升 C# 代码的灵活性和可维护性,尤其在 LINQ、委托回调等场景中必不可少。
328

被折叠的 条评论
为什么被折叠?



