首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C# 事件

  • 25-03-07 17:42
  • 4075
  • 9505
blog.csdn.net

 本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正

1.什么是事件

在看前,牢记事件的本质还是委托(C# 委托-CSDN博客),仍旧是包裹函数的一种方式

在C#中,事件(Event)是一种特殊的委托类型,用于在对象之间传递消息或通知

事件通常用于实现发布-订阅模式(Publisher-Subscriber Pattern)

  1. 发布者(Publisher):包含事件定义的对象
  2. 订阅者(Subscriber):响应事件的对象
  3. 事件处理器(Event Handler):订阅者用来处理事件的方法

 图示:先发布和订阅

 

后写好触发方法,就可以触发了

waring:事件只能在声明它的类内部触发:事件只能在声明它的类内部调用(或结构体内)

这意味着只有发布者类可以触发事件,而订阅者类只能订阅和响应事件

2.事件的发布订阅与触发 (事件监听)

事件的声明包括但不限于下面两种方式:

  1. //可以先定义一个委托,再定义事件
  2. delegate void D(int t);
  3. event D thisevent;
  4. //或者直接用c#定义好的委托直接定义事件
  5. event Action<int> thisevent1;

发布者

发布者类出一个事件和一个触发方法

  1. class Publisher {
  2. //这里是一个定义好的事件
  3. public event Action<int> thisevent;
  4. //这里是一个自定义的触发函数
  5. public void Tigger(int a)
  6. {
  7. if(thisevent!=null)
  8. {
  9. //已被订阅就触发事件
  10. thisevent(a);
  11. }
  12. else
  13. {
  14. //抛出异常
  15. throw new Exception("未订阅事件,你用个der!");
  16. }
  17. }
  18. }

订阅者 

订阅者类出一个函数:

  1. class Subscriber
  2. {
  3. //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
  4. public void AnyFunction(int t)
  5. {
  6. Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
  7. }
  8. }

触发 

  1. Publisher publisher =new Publisher();
  2. Subscriber subscriber =new Subscriber();
  3. //订阅
  4. publisher.thisevent += subscriber.AnyFunction;
  5. //触发
  6. publisher.Tigger(1);

 

如果中途因为什么原因给事件没有被订阅,那么就会抛出异常

  1. Publisher publisher =new Publisher();
  2. Subscriber subscriber =new Subscriber();
  3. //订阅
  4. //publisher.thisevent += subscriber.AnyFunction;
  5. publisher.thisevent += null;
  6. //触发
  7. publisher.Tigger(1);

总览 

  1. Publisher publisher =new Publisher();
  2. Subscriber subscriber =new Subscriber();
  3. //订阅
  4. //publisher.thisevent += subscriber.AnyFunction;
  5. publisher.thisevent += null;
  6. //触发
  7. publisher.Tigger(1);
  8. class Publisher {
  9. #region 先定义委托再定义事件
  10. 可以先定义一个委托,再定义事件
  11. //delegate void D(int t);
  12. //event D thisevent;
  13. 或者直接用c#定义好的委托直接定义事件
  14. #endregion
  15. //这里是一个定义好的事件
  16. public event Action<int> thisevent;
  17. //这里是一个自定义的触发函数
  18. public void Tigger(int a)
  19. {
  20. if(thisevent!=null)
  21. {
  22. //已被订阅就触发事件
  23. thisevent(a);
  24. }
  25. else
  26. {
  27. //抛出异常
  28. throw new Exception("未订阅事件,你用个der!");
  29. }
  30. }
  31. }
  32. class Subscriber
  33. {
  34. //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
  35. public void AnyFunction(int t)
  36. {
  37. Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
  38. }
  39. }

 更能体现事件监听,监听二字的另外一种“上锁”的方法,就是再给触发部分加一部分条件(自定义的Monitor函数就是一个简单直白的体现)

  1. Publisher publisher =new Publisher();
  2. Subscriber subscriber =new Subscriber();
  3. //订阅
  4. publisher.thisevent += subscriber.AnyFunction;
  5. //publisher.thisevent += null;
  6. //触发
  7. publisher.Monitor(5);
  8. class Publisher {
  9. #region 先定义委托再定义事件
  10. 可以先定义一个委托,再定义事件
  11. //delegate void D(int t);
  12. //event D thisevent;
  13. 或者直接用c#定义好的委托直接定义事件
  14. #endregion
  15. //这里是一个定义好的事件
  16. public event Action<int> thisevent;
  17. //这里是一个自定义的触发函数
  18. public void Tigger(int a) {
  19. if (thisevent != null) {
  20. //已被订阅就触发事件
  21. thisevent(a);
  22. }
  23. else {
  24. //抛出异常
  25. throw new Exception("未订阅事件,你用个der!");
  26. }
  27. }
  28. //这里订阅一个监听函数
  29. public void Monitor(int monitor)
  30. {
  31. if(monitor>=5)
  32. {
  33. Tigger(monitor);
  34. }
  35. else
  36. {
  37. Console.WriteLine("条件不满足");
  38. }
  39. }
  40. }
  41. class Subscriber
  42. {
  43. //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
  44. public void AnyFunction(int t)
  45. {
  46. Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
  47. }
  48. }

 

 

 

 

 

注:本文转载自blog.csdn.net的咩咩觉主的文章"https://blog.csdn.net/2301_77947509/article/details/140675977"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top