0

0

C# 匿名方法使用方法 C#如何创建和使用匿名方法

畫卷琴夢

畫卷琴夢

发布时间:2026-01-20 13:28:02

|

223人浏览过

|

来源于php中文网

原创

C#匿名方法是C# 2.0引入的无名内联方法,以delegate关键字定义,需绑定具体委托类型;它支持多语句和变量捕获但不支持async,而lambda更简洁、优化更好且支持表达式树和异步。

c# 匿名方法使用方法 c#如何创建和使用匿名方法

什么是 C# 匿名方法?它和 lambda 表达式有什么区别

匿名方法是 C# 2.0 引入的语法,用于内联定义没有名称的方法体,直接作为委托实例传入。它不是“更高级的 lambda”,而是更底层、更冗长的写法——delegate 关键字开头,没有返回类型声明(由委托类型推导),也没有参数类型显式标注(也可省略,但需匹配委托签名)。

x => x.ToString() 这类 lambda 相比,匿名方法更适合需要多语句、局部变量捕获或明确空参数列表的场景;但编译器对 lambda 的优化更好,现代 C# 项目中几乎不再主动写匿名方法。

如何用 delegate 关键字创建匿名方法?

必须绑定到兼容的委托类型。常见错误是直接写 delegate { } 而不赋值给变量或传参,这会导致编译失败:“无法将匿名方法转换为类型‘object’”。

  • 必须指定委托类型,例如 ActionFunc 或自定义委托
  • 参数列表可省略(此时调用时不能传参),也可显式写出(类型可省略,如 delegate(int x) { return x > 0; }
  • 返回值必须与委托声明一致;若委托返回 void,方法体内不能有 return 值语句
Action sayHello = delegate { Console.WriteLine("Hello"); };
Func isPositive = delegate(int n) { return n > 0; };

匿名方法怎么捕获外部变量?要注意什么?

可以访问所在作用域的局部变量和参数,但要注意闭包生命周期问题:变量会延长至委托实例存活期,而非原始作用域结束时销毁。

典型陷阱是循环中创建多个匿名方法却共用同一个循环变量:

拍客piikee竞拍系统
拍客piikee竞拍系统

拍客竞拍系统是一款免费竞拍网站建设软件,任何个人可以下载使用,但未经商业授权不能进行商业活动,程序源代码开源,任何个人和企业可以进行二次开发,但不能以出售和盈利为目的。安装方法,将www文件夹里面的所有文件上传至虚拟主机,在浏览器执行http://你的域名/install.php或者直接导入数据库文件执行。本次升级优化了一下内容1,程序和模板完美分离。2,优化了安装文件。3,后台增加模板切换功能。

下载
var actions = new List();
for (int i = 0; i < 3; i++) {
    actions.Add(delegate { Console.WriteLine(i); });
}
foreach (var a in actions) a(); // 输出:3, 3, 3(不是 0,1,2)

解决办法是在循环内复制变量:int localI = i;,再在匿名方法中使用 localI

什么时候该用匿名方法而不是 lambda?

极少情况。只有当你要写多语句逻辑且不想升级到 C# 3.0+ 语法,或对接旧版 API 强制要求 delegate 形式时才用。Lambda 在所有现代场景下都更简洁、可读性更高、支持表达式树(如 LINQ to Entities)。

一个真实但边缘的例子:WinForms 中老式事件订阅有时仍见 button.Click += delegate { ... };,但这只是为了兼容极老代码模板;新项目一律用 += (s,e) => { ... }

真正容易被忽略的是:匿名方法不支持异步(async delegate 是非法语法),要异步必须用 lambda + async 修饰符。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

97

2025.11.27

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

0

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

时间管理,自律给我自由
时间管理,自律给我自由

共5课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号