委托和事件
第四章 委托和事件
1.概念
委托:委托相当于C++中的函数指针,但它是类型安全的。定义一个委托实际上是定义了一个类型,可以把委托看成一种特殊的对象类型,委托可以用于调用与委托返回值类型、参数个数、参数类型完全相同的方法。
委托的定义: 访问修饰符 delegate 返回值类型 委托类型名(参数列表); //委托类型的定义中不包含函数体
例: public delegate void Mydelegate(string name);
事件:事件可以看作一个特殊的委托对象,存在一个与事件同名的方法,当事件被引发时,调用与事件同名的方法,该方法依次执行事件调用列表中所有的方法,实现事件的处理。
事件的定义是基于委托的,需要先定义一个委托类型,然后在委托类型的定义之上定义一个事件,格式为:
访问修饰符 delegate 返回值类型 委托类型名(参数列表);
访问修饰符 event 委托类型名 事件名;
事件发布和订阅的步骤:
1)定义委托类型,并在发布者类中定义一个该类型的事件共有成员;
2)在订阅者类中定义委托事件的处理办法;
3)订阅者对象将其事件的处理办法链接到发布者对象的委托成员(一个委托类型的引用)上;
4)发布者对象在特定情况下激发委托操作,从而自动调用订阅者对象的委托事件处理办法。
匿名方法:实例化委托时内联声明的方法。
3.Lambda表达式
"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。
1)无参的:()=>{处理语句};
2)一个参数的:参数=>{处理语句};
3)多个参数的:(参数1,参数2,...)=>{处理语句};
备注:只有一条处理语句的时候{}可以省略
(x, y) => x * y //多参数,隐式类型=> 表达式
x => x * 5 //单参数, 隐式类型=>表达式
x => { return x * 5; } //单参数,隐式类型=>语句块
(int x) => x * 5 //单参数,显式类型=>表达式
(int x) => { return x * 5; } //单参数,显式类型=>语句块
() => Console.WriteLine() //无参数
列举委托 delegate,Action,Func 的所有使用方式: 点这里
异步更新进度条例子: 点这里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY