C#的事件处理和自定义事件的进一步理解

来源:互联网 发布:培训数控编程要多少钱 编辑:程序博客网 时间:2024/05/18 03:14

此篇文章的转载处来于  http://dev.csdn.net/Develop/article/22/22951.shtm   。抄袭他的东西是不道德的,我会加入一些自己的想法.

public delegate void EventHandler( object sender , EventArgs e )

//delegate是定义事件委派的关键字,然后此事件的返回类型是void,也就是没有返回值,EvenHandler是一个委派申明,而这个委派申明看起来更象是我们定义的一个类型.

public event EventHandler Click;

//event是定义事件的关键字,EventHandler则是把此处的Click事件与EvenHandler挂钩.如果在后面调用Click方法,则会用EventHandler找到对应的事件具体的处理方法.

private void button1_Click(object sender, System.EventArgs e){.................}//这个我们将把他作为Click事件的具体处理方法.按照英文书中所描述的,这个方法与Click所在类是不能相同的.

但实际上此处的处理方法与Click并无任何关系.那么怎么将他们建立关系呢?使用如下语句即可.

this.button1.Click += new System.EventHandler(this.button1_Click);//这样就把他绑定好了.这行代码是要放在上面代码外面的.

现在来讲个例子.

using System;//命名空间
class UserInputMonitor//定义一个类
{
public delegate void UserRequest(object sender,EventArgs e);//委派
//定义委托
public event UserRequest OnUserRequest;//与上面的挂钩
//此委托类型类型的事件
public void Run()//一个死循环函数,不停的监听用户的输入并作出相应的反映,触发事件
{
bool finished=false;
do
{
if (Console.ReadLine()=="h")
{
OnUserRequest(this,new EventArgs());
}
}while(!finished);
}
}
public class Client//定义类
{
public static void Main()
{
UserInputMonitor monitor=new UserInputMonitor();//定义monitor,此实例有事件.
new Client(monitor);//最重要的就是这里,将事件与实际处理代码挂钩.
monitor.Run();//开始监听.
}
private void ShowMessage(object sender,EventArgs e)//事件的具体处理方法
{
Console.WriteLine("HaHa!!");
}
Client(UserInputMonitor m)//初始化函数
{
m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);
//将事件的具体处理方法附加上去m.OnUserRequest+=new m.UserRequest(this.ShowMessage);
//注意这种写法是错误的,因为委托是静态的
}
}
为了加深印象,我来模仿一下这个事件的发生过程.
第一步,Main()被调用,此时,定义了一个UserInputMonitor的实例monitor.
第二步,通过初始化函数将ShowMessage方法与monitor的OnUserRequest事件挂钩,OnUserRequest发生
就是ShowMessage发生的时候,开始监听.
第三步:当监听到"h"的时候,触发事件,此时ShowMessage就会执行.整个过程分析完毕.
如果我有分析得步对得,请各位高人指教,希望作者能够看到我得分析,也请指教.
原创粉丝点击