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 事件名称;
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:



少有人走的路



















