c#中事件的声明和触发是通过定义的delegate委托类型来完成的
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 事件1 { class Program { static void Main(string[] args) { myChangedEvent mce = new myChangedEvent(); myEventListener mel = new myEventListener(mce); mce.ToString(); mel.detach(); mce.ToString(); } } public delegate void myEventHandler(object s,EventArgs e);//声明自定义的事件委托,用来执行事件的声明,和处理方法的传递 class myChangedEvent { public event myEventHandler Changed;//利用委托来声明事件 protected virtual void OnChanged(EventArgs e)//声明事件触发的方法 { if (Changed != null) Changed(this, e);//触发事件 } public override string ToString() { OnChanged(EventArgs.Empty);//调用事件触发方法 return "执行ToString"; } } class myEventListener//声明事件监听的类型,并为以上声明事件传入处理方法 { private myChangedEvent mce; public myEventListener(myChangedEvent Mce) { mce = Mce;//利用构造函数,获得对象的引用 mce.Changed+=new myEventHandler(ListenerChanged);//为其事件添加自定义的处理方法 } private void ListenerChanged(object s,EventArgs e)//声明一个符合事件委托签名的处理方法 { Console.WriteLine("已经触发事件!"); } public void detach() { mce.Changed -= new myEventHandler(ListenerChanged); } } }
事件的声明过程
1.存在已经声明的事件委托,该委托位于namespace下,可全局访问
namespace 命名空间 { publice delegate void 事件委托(object sender,EventArgs e); class 类1{/*....*/} class 类2{/*....*/} }
2.在数据类型中利用event和事件委托来声明事件,并声明事件触发方法
class 类1 { public event 事件委托类型 事件名称; protected virtual void 触发事件(EventArgs e) { if (事件名称 != null) 事件名称(this, e); } }
3.事件绑定,利用事件声明的对象实例,声明符合事件委托签名的方法,利用+=或-=来进行事件的绑定和解除
{ 类1 类1变量=new 类1(); 类1变量.事件名称+=new 事件委托类型(事件处理方法); } /*...*/ public void 事件处理方法(object sender,EventArgs e) { /*处理过程*/ }
4.事件触发,代码利用事件声明中的触发事件的方法即可
注意:.Net提供自带的事件委托类型EventHandler(msdn:http://msdn.microsoft.com/zh-cn/library/system.eventhandler.aspx)
利用EventHandler,可以直接声明对象事件,免去自定义委托的声明
public event EventHandler 事件名称;