翼度科技»论坛 编程开发 .net 查看内容

C#委托和事件简单复习

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
C#委托

太久没用了,简单的复习一下
快速过一遍语法使用
使用委托的步骤

1.定义一个委托类型
只需要在声明的前面加上delegate关键字,其他的就跟声明一个方法(函数)类似
  1. public delegate void SayHello(string name);
复制代码
2.使用刚刚声明的委托
需要定义一个返回值跟参数与我们刚刚定义的委托一致
  1. public static void MyFunc(string name)
  2. {
  3.         Console.WriteLine($"Hello {name}");
  4. }
复制代码
3.然后声明一个SayHello类型(委托)的变量
把前面定义的方法赋值给变量
然后就可以使用委托像正常调用MyFunc一样使用该方法
  1. SayHello say = MyFunc;
  2. //调用委托
  3. say("Tom");
  4. //进入MyFunc输出 "Hello Tom"
复制代码
也可以使用Lambda表达式给委托赋值
  1. SayHello say = (string name)=> {
  2.         Console.WriteLine($"Hello {name}");
  3. };
  4. SayHello say = name=> {
  5. Console.WriteLine($"Hello {name}");
  6. };
复制代码
效果都是一样的
委托也可以定义为泛型,除了delegate其他都与声明方法(函数)无异
  1. public delegate bool Compare<T1,T2>(T1 t1,T2 t2);
复制代码


对委托最常使用的方法是 Invoke() 和 BeginInvoke() / EndInvoke()
Invoke() 会调用赋值给委托的所有方法
直接调用也是全部方法都调用say()
要注意的是除了第一次赋值其他都要用+=的方式赋值,否则后面的会覆盖掉前面的
  1. 最终结果输出   "不想打招呼"
  2. //第一次赋值
  3. SayHello say = name => {
  4.         Console.WriteLine($"你好 {name}");
  5. };
  6. //还是用 = 号赋值
  7. say = MyFunc;
  8. say = _ => {
  9. Console.WriteLine("不想打招呼");
  10. };
  11. say("Tom");
  12. //say.Invoke("Tom");
复制代码
  1. 最终输出 :
  2. {
  3.     你好 Tom
  4.     Hello Tom
  5.     不想打招
  6. }
  7. //第一次赋值
  8. SayHello say = name => {
  9.         Console.WriteLine($"你好 {name}");
  10. };
  11. say += MyFunc;
  12. say += _ => {
  13. Console.WriteLine("不想打招呼");
  14. };
  15. say("Tom");
  16. //say.Invoke("Tom");
复制代码
还有就是可以使用 -= 移除方法
  1. SayHello say = name => {
  2.         Console.WriteLine($"你好 {name}");
  3. };
  4. say += MyFunc;
  5. say += _ => {
  6. Console.WriteLine("不想打招呼");
  7. };
  8. //移除MyFunc,这样最后就不会输出 Hello Tom 了
  9. say-=MyFunc;
  10. say("Tom");
复制代码
官方提供的定义好的委托

1.Action:没有返回值,返回值为void
2.Func:有返回值,泛型的最后一个参数为返回值类型,
比如:Func 或 Func int 就是方法的返回值
3.Predicate 返回值为 bool
事件 Event

事件是跟委托结合使用的,事件基于委托,而且是多播委托
定义一个事件的语法就是 event +委托(定义好的委托)+变量名(随便取,不过最好规范点)
  1.         public event SayHello OnSayHello;
复制代码
和委托不一样事件只能通过+= 和 -= 添加和移除方法
所有添加(订阅了OnSayHello)的方法在事件调用(触发)的时候都会收到通知,
也就是被调用
  1. OnSayHello += Program_OnSayHello;
  2. OnSayHello += s => {
  3.         Console.WriteLine($"张三听到有人在叫{s}");
  4. };
  5. OnSayHello += _ => { Console.WriteLine("有人在招呼?"); };
  6. //OnSayHello("Tom");
  7. OnSayHello.Invoke("Tom");
  8. private static void Program_OnSayHello(string name)
  9.         {
  10.                 Console.WriteLine($"有人在跟{name}招呼");
  11.         }
  12.        
  13. //最终输出
  14. 有人在跟Tom招呼
  15. 张三听到有人在叫Tom
  16. 有人在招呼?       
复制代码
区别委托和事件

我们发现委托跟事件 好像很像,但还是要根据不同的情况选择。
更多
C#委托和事件之间的区别如下:

  • 委托是一个包含一个或多个方法引用的对象,它可以在程序中传递和调用方法。而事件是一个特殊类型的委托,它只能在定义它的类中触发,并且它通常用于实现观察者模式。
  • 委托可以在程序中的任何地方调用,而事件只能在定义事件的类中触发。
  • 委托可以被任何方法调用,而事件只能由一个或多个特定的方法注册和调用。
  • 委托可以使用“+”和“-”运算符来添加和移除方法,而事件只能使用“+=”和“-=”运算符来添加和移除事件处理程序。
  • 委托可以直接调用方法,而事件必须在事件处理程序中被触发。

来源:https://www.cnblogs.com/ChuanC/archive/2023/08/01/17598850.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具