C# 匿名方法使用方法 C#如何创建和使用匿名方法
技术百科
畫卷琴夢
发布时间:2026-01-20
浏览: 次 C#匿名方法是C# 2.0引入的无名内联方法,以delegate关键字定义,需绑定具体委托类型;它支持多语句和变量捕获但不支持async,而lambda更简洁、优化更好且支持表达式树和异步。
什么是 C# 匿名方法?它和 lambda 表达式有什么区别?
匿名方法是 C# 2.0 引入的语法,用于内联定义没有名称的方法体,直接作为委托实例传入。它不是“更高级的 lambda”,而是更底层、更冗长的写法——delegate 关键字开头,没有返回类型声明(由委托类型推导),也没有参数类型显式标注(也可省略,但需匹配委托签名)。
和 x => x.ToString() 这类 lambda 相比,匿名方法更适合需要多语句、局部变量捕获或明确空参数列表的场景;但编译器对 lambda 的优化更好,现代 C# 项目中几乎不再主动写匿名方法。
如何用 delegate 关键字创建匿名方法?
必须绑定到兼容的委托类型。常见错误是直接写 delegate { } 而不赋值给变量或传参,这会导致编译失败:“无法将匿名方法转换为类型‘object’”。
- 必须指定委托类型,例如
Action、Func或自定义委托 - 参数列表可省略(此时调用时不能传参),也可显式写出(类型可省略,如
delegate(int x) { return x > 0; }) - 返回值必须与委托声明一致;若委托返回
void,方法体内不能有return值语句
Action sayHello = delegate { Console.WriteLine("Hello"); };
Func isPositive = delegate(int n) { return n > 0; }; 匿名方法怎么捕获外部变量?要注意什么?
可以访问所在作用域的局部变量和参数,但要注意闭包生命周期问题:变量会延长至委托实例存活期,而非原始作用域结束时销毁。
典型陷阱是循环中创建多个匿名方法却共用同一个循环变量:
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 修饰符。
# 是在
# 的是
# 这类
# 多个
# 当你
# 而不
# 绑定
# 也可
# 要注意
# 什么时候
# win
# 循环
# int
# void
# 区别
# c#
# 委托
# gate
# 异步
# 事件
# 作用域
# Delegate
# 闭包
# Object
# Lambda
# 匿名方法
# bool
# 局部变量
# linq
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++怎么操作redis数据库_c++ hired
- Windows10系统怎么查看运行时间_Win10
- c++中如何求一个数的平方根_c++ sqrt函数
- Win10怎么卸载剪映_Win10彻底卸载剪映方法
- Win11怎么忘记WiFi网络_Win11删除已保
- 如何优化Golang Web性能_Golang H
- Windows怎样关闭开始菜单广告_Windows
- Win11怎么设置应用分屏_Windows11贴靠
- Win11怎么关闭自动调节亮度_Windows11
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- 本地php环境出现502错误_nginx或apac
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- C++如何将C风格字符串(char*)转换为std
- Win11怎么更改鼠标指针_Windows 11自
- c# 如何用c#实现一个支持优先级的任务队列
- Win11怎么关闭粘滞键_彻底禁用Windows
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- Win11怎么开启智能存储_Windows11存储
- Win11怎么更改电脑名称_Windows 11修
- Win11摄像头无法使用怎么办_Win11相机隐私
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- Linux怎么查找死循环进程_Linux系统负载分
- ACF 教程:正确更新嵌套在多层 Group 字段
- php本地部署支持nodejs吗_php与node
- Python异步网络编程_aiohttp说明【指导
- Win11怎么设置默认终端应用_Windows11
- Python路径拼接规范_跨平台处理说明【指导】
- php本地部署后数据库连接报错_1045acces
- Win11如何更改任务栏颜色 Win11自定义任务
- php怎么连接数据库_MySQL数据库连接的基础代
- Linux如何申请SSL免费证书_Linux下Ce
- 如何在Golang中实现基础配置管理功能_Gola
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Go 中 defer 语句在 goroutine
- Mac的访达(Finder)怎么用_Mac文件管理
- Win11文件扩展名怎么显示_Win11查看文件后
- c++的位运算怎么用 与、或、异或、移位操作详解【
- Win11怎么设置默认图片查看器_Windows1
- Win10系统怎么查看显卡温度_Win10任务管理
- mac怎么右键_MAC鼠标右键设置与触控板手势技巧
- Win10怎么查看内存时序参数_Win10CPU-
- Windows10如何重置此电脑_Windows1
- 如何使用Golang template生成文本模板
- 如何在包含多值的列中精准搜索指定演员?
- 如何使用Golang捕获并记录协程panic_保证
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- 如何使用Golang处理网络超时错误_Golang
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- Win11怎么设置鼠标宏_Win11鼠标按键自定义


QQ客服