您的位置:首页 > 编程语言 > C#

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

2013-03-29 16:00 363 查看
一、事件的感性认识:

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

事件的发送方称作为发布者(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://yongx.blog.51cto.com/1835267/1166655
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: