C#语言知识点整理 - 事件

发布时间:2020-07-07 10:13:06 作者:勇闯天涯X
来源:网络 阅读:771

一、事件的感性认识:

    现实生活中的“事件”无所不在,时刻都在发生,软件层面上的常见事件无非是鼠标事件、键盘事件、操作系统自己发出的事件。

    事件的发送方称作为发布者(sender),接收事件的一方称作订阅者(receiver),一个事件可以有多个订阅者。 一个订阅者可处理来自多个发布者的多个事件。典型的多对多关系。

    发布者和订阅者互相都不了解,只是通过Delegate委托来在之间交互,委托在这里起到了“媒人”作用。同时.net的事件机制很容易实现设计模式的观察者模式。 

二、事件的不严格定义:

    1) 事件是特殊类型的多路广播委托

    2) 向其他类或对象提供通知的一种方式。 

三、例子:

    MSDN上有几个例子,我综合了下,作为编写事件的模板吧

   1:  
   2: using System;
   3: using System.Collections.Generic;
   4: using System.Linq;
   5: using System.Text;
   6:  
   7: namespace CSharp.Event
   8: {
   9:     public delegate void MyEventHandler(string s);
  10:  
  11:     public interface IPublisher
  12:     {
  13:         // 接口可声明事件。
  14:         event EventHandler<CustomEventArgs> RaiseCustomEvent;
  15:         //自定义事件访问器,可选
  16:         event MyEventHandler OnMyEvent;
  17:     }
  18:  
  19:     /// <summary>
  20:     /// 自定义EventArgs类,用来保存事件信息
  21:     /// </summary>
  22:     public class CustomEventArgs : EventArgs
  23:     {
  24:         private string message;
  25:  
  26:         public string Message
  27:         {
  28:             get { return message; }
  29:             set { message = value; }
  30:         }
  31:  
  32:         public CustomEventArgs(string s)
  33:         {
  34:             message = s;
  35:         }
  36:  
  37:     }
  38:  
  39:     /// <summary>
  40:     /// 发布者
  41:     /// </summary>
  42:     class Publisher : IPublisher
  43:     {
  44:         object objectLock = new Object();
  45:         //使用EventHandler<T> 声明事件
  46:         public event EventHandler<CustomEventArgs> RaiseCustomEvent;
  47:         private event MyEventHandler _myEventHandler;
  48:  
  49:         /// <summary>
  50:         ///  在大多数情况下都不需要提供自定义的事件访问器。
  51:         ///  如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。
  52:         /// </summary>
  53:         public event MyEventHandler OnMyEvent
  54:         {
  55:             add
  56:             {
  57:                 lock (objectLock)
  58:                 {
  59:                     _myEventHandler += value;
  60:                 }
  61:             }
  62:             remove
  63:             {
  64:                 lock (objectLock)
  65:                 {
  66:                     _myEventHandler -= value;
  67:                 }
  68:             }
  69:         }
  70:  
  71:         public void DoSomething()
  72:         {
  73:             //省略。。。
  74:  
  75:             //自己引发事件
  76:             OnRaiseCustomEvent(new CustomEventArgs("Did something"));
  77:             //省略。。。
  78:  
  79:             if (_myEventHandler != null)
  80:             {
  81:  
  82:                 _myEventHandler("你轻轻的走,不带走一片云彩!");
  83:             }
  84:  
  85:         }
  86:  
  87:         /// <summary>
  88:         /// 公开protected virtual方法,允许继承类重写事件调用行为
  89:         /// </summary>
  90:         /// <param name="e"></param>
  91:         protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
  92:         {
  93:             EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
  94:  
  95:             //如果没有订阅者,事件为空
  96:             if (handler != null)
  97:             {
  98:                 e.Message += String.Format(" at {0}", DateTime.Now.ToString());
  99:  
 100:                 //触发事件
 101:                 handler(this, e);
 102:             }
 103:         }
 104:  
 105:    
 106:     }
 107:  
 108:     /// <summary>
 109:     /// 订阅者
 110:     /// </summary>
 111:     class Subscriber
 112:     {
 113:         private string id;
 114:         public Subscriber(string ID, Publisher pub)
 115:         {
 116:             id = ID;
 117:             //多路广播委托实现事件订阅
 118:             pub.RaiseCustomEvent += HandleCustomEvent;
 119:             pub.OnMyEvent += new MyEventHandler(pub_OnMyEvent);
 120:         }
 121:  
 122:         void pub_OnMyEvent(string s)
 123:         {
 124:             Console.WriteLine(string.Format("{0} 的开场白:{1}", id, s));
 125:         }
 126:  
 127:         /// <summary>
 128:         /// 当订阅者接收到事件,该做什么反应
 129:         /// 也就是常说的事件处理逻辑
 130:         /// </summary>
 131:         /// <param name="sender"></param>
 132:         /// <param name="e"></param>
 133:         void HandleCustomEvent(object sender, CustomEventArgs e)
 134:         {
 135:             Console.WriteLine(id + " received this message: {0}", e.Message);
 136:         }
 137:     }
 138:  
 139:     class Program
 140:     {
 141:         static void Main(string[] args)
 142:         {
 143:             //实例一个发布者
 144:             Publisher pub = new Publisher();
 145:             //实例两个订阅者sub1,sub2,他们计划收听pub
 146:             Subscriber sub1 = new Subscriber("sub1", pub);
 147:             Subscriber sub2 = new Subscriber("sub2", pub);
 148:  
 149:             //发布者通过DoSomething触发事件,开始发布信息
 150:             pub.DoSomething();
 151:  
 152:             Console.WriteLine("Press Enter to close this window.");
 153:             Console.ReadLine();
 154:         }
 155:     }
 156: }
附件:http://down.51cto.com/data/2362519
推荐阅读:
  1. 基于事件触发PowerShell重置文件权限
  2. EventBus Usage

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

event

上一篇:使用linux的renice命令进行系统管理

下一篇:Python 编程快速上手 让繁琐工作自动化-第十一章实践项目 11.11.2 图像网站下载

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》