C#委托
太久没用了,简单的复习一下
快速过一遍语法使用
使用委托的步骤
1.定义一个委托类型
只需要在声明的前面加上delegate关键字,其他的就跟声明一个方法(函数)类似
public delegate void SayHello(string name);
2.使用刚刚声明的委托
需要定义一个返回值跟参数与我们刚刚定义的委托一致
public static void MyFunc(string name) { Console.WriteLine($"Hello {name}"); }
3.然后声明一个SayHello类型(委托)的变量
把前面定义的方法赋值给变量
然后就可以使用委托像正常调用MyFunc一样使用该方法
SayHello say = MyFunc; //调用委托 say("Tom"); //进入MyFunc输出 "Hello Tom"
也可以使用Lambda表达式给委托赋值
SayHello say = (string name)=> { Console.WriteLine($"Hello {name}"); }; SayHello say = name=> { Console.WriteLine($"Hello {name}"); };
效果都是一样的
委托也可以定义为泛型,除了delegate其他都与声明方法(函数)无异
public delegate bool Compare<T1,T2>(T1 t1,T2 t2);
二
对委托最常使用的方法是 Invoke() 和 BeginInvoke() / EndInvoke()
Invoke() 会调用赋值给委托的所有方法
直接调用也是全部方法都调用say()
要注意的是除了第一次赋值其他都要用+=的方式赋值,否则后面的会覆盖掉前面的
最终结果输出 "不想打招呼" //第一次赋值 SayHello say = name => { Console.WriteLine($"你好 {name}"); }; //还是用 = 号赋值 say = MyFunc; say = _ => { Console.WriteLine("不想打招呼"); }; say("Tom"); //say.Invoke("Tom");
最终输出 : { 你好 Tom Hello Tom 不想打招 } //第一次赋值 SayHello say = name => { Console.WriteLine($"你好 {name}"); }; say += MyFunc; say += _ => { Console.WriteLine("不想打招呼"); }; say("Tom"); //say.Invoke("Tom");
还有就是可以使用 -= 移除方法
SayHello say = name => { Console.WriteLine($"你好 {name}"); }; say += MyFunc; say += _ => { Console.WriteLine("不想打招呼"); }; //移除MyFunc,这样最后就不会输出 Hello Tom 了 say-=MyFunc; say("Tom");
官方提供的定义好的委托
1.Action:没有返回值,返回值为void
2.Func:有返回值,泛型的最后一个参数为返回值类型,
比如:Func<string,int> 或 Func
3.Predicate 返回值为 bool
事件 Event
事件是跟委托结合使用的,事件基于委托,而且是多播委托
定义一个事件的语法就是 event +委托(定义好的委托)+变量名(随便取,不过最好规范点)
public event SayHello OnSayHello;
和委托不一样事件只能通过+= 和 -= 添加和移除方法
所有添加(订阅了OnSayHello)的方法在事件调用(触发)的时候都会收到通知,
也就是被调用
OnSayHello += Program_OnSayHello; OnSayHello += s => { Console.WriteLine($"张三听到有人在叫{s}"); }; OnSayHello += _ => { Console.WriteLine("有人在招呼?"); }; //OnSayHello("Tom"); OnSayHello.Invoke("Tom"); private static void Program_OnSayHello(string name) { Console.WriteLine($"有人在跟{name}招呼"); } //最终输出 有人在跟Tom招呼 张三听到有人在叫Tom 有人在招呼?
区别委托和事件
我们发现委托跟事件 好像很像,但还是要根据不同的情况选择。
更多
C#委托和事件之间的区别如下:
-
委托是一个包含一个或多个方法引用的对象,它可以在程序中传递和调用方法。而事件是一个特殊类型的委托,它只能在定义它的类中触发,并且它通常用于实现观察者模式。
-
委托可以在程序中的任何地方调用,而事件只能在定义事件的类中触发。
-
委托可以被任何方法调用,而事件只能由一个或多个特定的方法注册和调用。
-
委托可以使用“+”和“-”运算符来添加和移除方法,而事件只能使用“+=”和“-=”运算符来添加和移除事件处理程序。
-
委托可以直接调用方法,而事件必须在事件处理程序中被触发。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人