看了园子里好多前辈高手对于.Net事件和委托的文章,觉得受益非浅。俗话说,“好记性不如烂笔头”,开博至今,为免纰漏,一直不敢将自己写的粗糙代码放上来,今天又看到群里的人在问委托与事件的简单问题,为此,特别写了一个由生活实例抽象出来的最简单的委托与事件的DEMO,作为我在csdn上的第一篇文章,恳请各位路过的高手予以指正,不胜感激!
源码如下:
using System;
namespace SisterAndBrother
{
/* 家庭里有很多事件实例啊,例如:妈妈要做饭,就让女儿照看小儿子,
* 告诉他,一旦发现他尿尿了,就马上喊妈妈来。结果小儿子一会就尿
* 尿了打湿了裤子,女儿赶紧就喊妈妈,说:妈妈赶快来,弟弟尿尿了!
* 妈妈就过来把小儿子的裤子换掉。
*
* 在上面的这件事情中。首先,妈妈要女儿照看着小儿子,就是一个委托
* 声明,(也可以理解为一个特殊的“照看”类),只不过它特殊的是它在
* 实例化的时候,所带的签名是一个方法,就是“发现弟弟尿尿了喊妈妈“,
* 而这个”喊妈妈“就是一个方法,而非一般的属性(照看的人,照看的时
* 间等)。儿子尿尿就是一个事件。而女儿在照看着弟弟有没有拉尿尿(弟弟
* 尿尿了就喊妈妈)就是一个事件订阅。一旦触发(儿子开始尿尿了),女儿就
* 会执行这个实例化委托中签名的方法(”喊妈妈“)。
*/
//定义委托类
public delegate void UrineHandler(object sender, EventArgs e); //第一步 定义委托
class Program
{
static void Main(string[] args)
{
Console.WriteLine("场景开始了...");
//生成姐姐
姐姐 s = new 姐姐();
//生成弟弟
弟弟 b = new 弟弟();
//妈妈指定姐姐照看弟弟,就是一个事件订阅,也可称为实例化事件
b.Urine += new UrineHandler(s.喊妈妈); //第三步:事件订阅,将实例化的委托添加到弟弟的事件中
b.弟弟尿尿();//弟弟开始尿尿了,开始触发事件 第四步:某个方法触发事件
Console.WriteLine("场景结束...");
Console.ReadLine();
}
}
//姐姐类
public class 姐姐
{
//构造方法
public 姐姐()
{
Console.WriteLine("生成姐姐...");
}
//定义“喊妈妈"的方法
public void 喊妈妈(object sender, EventArgs e)
{
Console.WriteLine("姐姐发现弟弟尿尿了,开始喊...");
Console.WriteLine("妈妈赶快来,弟弟尿尿了!...");
Console.WriteLine("妈妈过来了,替儿子换衣服...");
}
}
//弟弟类
public class 弟弟
{
//先定义一个事件,这个事件表示弟弟拉尿尿
public event UrineHandler Urine; //第二步 定义与该委托相关联的事件
//构造方法
public 弟弟()
{
Console.WriteLine("生成弟弟...");
}
//定义弟弟尿尿的方法
public void 弟弟尿尿()
{
Console.WriteLine("弟弟开始尿尿了...");
System.EventArgs e = new EventArgs();
Urine(this, e); // 第五步:执行事件
}
}
}