初学事件和委托,整理一下,备忘,也给我和需要的朋友一个方便!
我现在还是一学生,欢迎交流,指教!
一个完整的事件处理包含以下几个要素:
一:事件的激发者;
二:事件的处理者;
三:指定委托。
下面通过一个程序来分别解说他的整个使用过程(程序是从网上下的,感谢原创者,我只是在他的解说的基础上加上我的理解整理出来而已!)
***事件的激发***
在一个函数中激发一个事件:
public void 玩游戏()
{
Console.WriteLine("小张开始玩游戏了..");
Console.WriteLine("小张:CS好玩,哈哈哈! 我玩..");
System.Threading.Thread.Sleep(500);
System.EventArgs e = new EventArgs();
OnPlayGame(e);
}
protected virtual void OnPlayGame(EventArgs e)
{
if (PlayGame != null)
{
PlayGame(this, e);
}
}
为了便于理解可以将其简化一下:
public void 玩游戏()
{
Console.WriteLine("小张开始玩游戏了..");
Console.WriteLine("小张:CS好玩,哈哈哈! 我玩..");
System.Threading.Thread.Sleep(500);
System.EventArgs e = new EventArgs();
PlayGame(this, e);
}
PlayGame为一个事件,定义如下:
public event PlayGameHandler PlayGame;
这样我们就可以方便的看出这个事件是怎么激发的了,
首先,定义一个事件public event PlayGameHandler PlayGame;(PlayGameHandler是必须先定义好的一个委托public delegate void PlayGameHandler(object sender,System.EventArgs e);)
然后,在需要的地方激发一个事件:
System.EventArgs e = new EventArgs();
PlayGame(this, e);
那个被简化掉了的函数是用于测试这个PlayGame事件是否已经被其他对象注册。因为小张类的PlayGame事件有可能没有其他类通知需要处理,那么这个代码:
if(PlayGame != null)就探测没有对象需要发送事件通知,否则表示已经有对象需要处理这个事件,就发送事件通知,让对象进行处理。
**事件的处理者**
public void 扣钱(object sender, EventArgs e)
{
Console.WriteLine("小王:好小子,上班时间胆敢玩游戏");
Console.WriteLine("小王:看看你小子有多少钱");
小张 f = (小张)sender;
Console.WriteLine("小张的钱: " + f.钱.ToString());
Console.WriteLine("开始扣钱");
System.Threading.Thread.Sleep(500);
f.钱 = f.钱 - 500;
Console.WriteLine("扣完了.现在小张还剩下:" + f.钱.ToString());
}
这里最值得注意的是:小张 f = (小张)sender,这个代码表示让小王扣小张的钱,那么,小王扣钱的时候,必须要操作小张的对象实例。方法参数里面有个object sender对象,这个对象表示激发事件的对象,在这个程序里面就表示这个sender其实是小张,但是传递的对象类型是object,所以必须使用对象类型转换语句把sender从object转成小张,所以有了:
小张 f = (小张)sender;其他的好像就没什么值得注意的了!
**指定委托**
// 生成小王
小王 w = new 小王();
// 生成小账
小张 z = new 小张();
z.PlayGame += new PlayGameHandler(w.扣钱);
z.PlayGame就是开始开始声明的那个事件了,而PlayGameHandler就是定义的委托,w.扣钱就是那个事件处理函数了!
事实上我们可以看一下winform里面自动生成的代码如button,如果你也是初学的话,不妨自己去看看它自己生成的代码是怎么样的,应该有所帮助!
this.btn_ok.Click += new System.EventHandler(this.btn_ok_Click);
转到click的定义:
// 摘要:
// 在单击控件时发生。
public event EventHandler Click;(也就是一个事件了)
转到EventHandler的定义:
public delegate void EventHandler(object sender, EventArgs e);(一个委托)
转到btn_ok_Click的定义,哈哈,不用怀疑,那就是你写的事件处理代码了!