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

一、事件的感性认识:

创新互联公司是专业的阳新网站建设公司,阳新接单;提供网站制作、做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行阳新网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

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

    事件的发送方称作为发布者(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 RaiseCustomEvent;
  15:         //自定义事件访问器,可选
  16:         event MyEventHandler OnMyEvent;
  17:     }
  18:  
  19:     /// 
  20:     /// 自定义EventArgs类,用来保存事件信息
  21:     /// 
  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:     /// 
  40:     /// 发布者
  41:     /// 
  42:     class Publisher : IPublisher
  43:     {
  44:         object objectLock = new Object();
  45:         //使用EventHandler 声明事件
  46:         public event EventHandler RaiseCustomEvent;
  47:         private event MyEventHandler _myEventHandler;
  48:  
  49:         /// 
  50:         ///  在大多数情况下都不需要提供自定义的事件访问器。
  51:         ///  如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。
  52:         /// 
  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:         /// 
  88:         /// 公开protected virtual方法,允许继承类重写事件调用行为
  89:         /// 
  90:         /// 
  91:         protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
  92:         {
  93:             EventHandler 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:     /// 
 109:     /// 订阅者
 110:     /// 
 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:         /// 
 128:         /// 当订阅者接收到事件,该做什么反应
 129:         /// 也就是常说的事件处理逻辑
 130:         /// 
 131:         /// 
 132:         /// 
 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

名称栏目:C#语言知识点整理-事件
分享链接:http://hbruida.cn/article/jdjehh.html