.Net中委托与事件入门级的写法(有趣的生活实例)

来源:互联网 发布:淘宝一个月后申请售后 编辑:程序博客网 时间:2024/05/16 12:27

      看了园子里好多前辈高手对于.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); // 第五步:执行事件          
        }
    }
}