跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp Func 委托
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C# Func委托}} '''Func委托'''是C#中预定义的泛型委托类型,用于封装具有返回值的方法。它是.NET框架中{{code|System}}命名空间下{{code|System}}核心库的一部分,广泛应用于LINQ、异步编程和事件处理等场景。与{{code|Action}}委托不同,{{code|Func}}委托要求方法必须返回一个值。 == 基本概念 == {{code|Func}}委托的签名遵循以下规则: * 最后一个泛型参数表示返回值类型。 * 前面的泛型参数表示输入参数的类型(最多支持16个输入参数)。 其通用形式为: <math>\text{Func<T1, T2, ..., T16, TResult>}</math> 例如: * {{code|Func<int>}}:无参数,返回{{code|int}}类型。 * {{code|Func<string, bool>}}:接受一个{{code|string}}参数,返回{{code|bool}}类型。 == 基本用法 == 以下示例展示如何声明和使用{{code|Func}}委托: <syntaxhighlight lang="csharp"> // 定义一个返回两数之和的方法 int Add(int a, int b) { return a + b; } // 使用Func委托封装该方法 Func<int, int, int> addDelegate = Add; // 调用委托 int result = addDelegate(3, 5); Console.WriteLine(result); // 输出: 8 </syntaxhighlight> === 匿名方法与Lambda表达式 === {{code|Func}}委托常与匿名方法或Lambda表达式结合使用: <syntaxhighlight lang="csharp"> // 使用Lambda表达式 Func<int, int, int> multiply = (x, y) => x * y; Console.WriteLine(multiply(4, 5)); // 输出: 20 // 使用匿名方法(C# 2.0+) Func<string, string> greet = delegate(string name) { return $"Hello, {name}!"; }; Console.WriteLine(greet("Alice")); // 输出: Hello, Alice! </syntaxhighlight> == 实际应用场景 == === 1. LINQ查询 === {{code|Func}}委托是LINQ操作的基础。例如{{code|Where}}方法的参数就是一个{{code|Func<T, bool>}}: <syntaxhighlight lang="csharp"> List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = numbers.Where(n => n % 2 == 0); // Func<int, bool> foreach (var num in evenNumbers) { Console.WriteLine(num); // 输出: 2, 4 } </syntaxhighlight> === 2. 高阶函数 === 将{{code|Func}}作为参数传递,实现更灵活的代码逻辑: <syntaxhighlight lang="csharp"> int ApplyOperation(Func<int, int, int> operation, int a, int b) { return operation(a, b); } int sum = ApplyOperation((x, y) => x + y, 10, 20); // 输出: 30 int product = ApplyOperation((x, y) => x * y, 10, 20); // 输出: 200 </syntaxhighlight> === 3. 缓存与惰性求值 === 利用{{code|Func}}实现延迟计算: <syntaxhighlight lang="csharp"> Lazy<int> lazyValue = new Lazy<int>(() => { Console.WriteLine("Calculating..."); return 42; }); Console.WriteLine(lazyValue.Value); // 第一次调用时计算并输出: Calculating... 42 Console.WriteLine(lazyValue.Value); // 直接返回缓存值: 42 </syntaxhighlight> == 性能注意事项 == * '''内存分配''':Lambda表达式可能隐式生成闭包类,影响内存使用。 * '''内联优化''':简单Lambda可能被JIT编译器内联优化。 * '''委托链''':避免过度组合{{code|Func}}委托(如{{code|Func1 + Func2}}),可能降低性能。 == 与其他委托的对比 == {| class="wikitable" ! 委托类型 !! 输入参数 !! 返回值 |- | {{code|Action}} | 支持0-16个 | 无 |- | {{code|Func}} | 支持0-16个 | 有 |- | {{code|Predicate<T>}} | 1个(T) | {{code|bool}} |} == 进阶:Func委托的实现原理 == 通过IL代码分析可知,{{code|Func}}本质上是编译器生成的类,继承自{{code|System.MulticastDelegate}}。例如: <mermaid> classDiagram class MulticastDelegate { +Invoke() +BeginInvoke() +EndInvoke() } class Func~T, TResult~ { +Invoke(T arg) : TResult } MulticastDelegate <|-- Func~T, TResult~ </mermaid> == 总结 == {{code|Func}}委托是C#中强大的工具,它: * 简化了方法引用的传递。 * 支持Lambda表达式实现简洁的匿名逻辑。 * 是LINQ和函数式编程的基石。 初学者应从简单示例入手,逐步掌握其在复杂场景(如异步编程或依赖注入)中的应用。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 委托与lambda]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Code
(
编辑
)