• 从发布者和订阅者来看事件


    一个事件代码,只需要记住5个部分即可,如图所示:

    1.声明委托:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型进行描述。

    2.声明事件:发布者类必须声明一个订阅者类可以注册的事件成员。

    3.触发事件:发布者类中触发事件,便会调用注册在事件上的所有事件处理程序。

    4.注册事件:订阅者必须订阅事件才能在事件被触发时得到通知。

    5.处理事件:订阅者会在事件发生后执行相应的处理程序。

    一、猫和老鼠的例子(不传递数据)

    代码如下:

    using System;
    namespace 练习专用
    {
    //声明委托
    public delegate void MyDel();

    //发布者类-猫
    class Cat
    {
    //声明事件
    public event MyDel CatCryEvent;
    //在猫叫的方法中触发事件
    public void Cry()
    {
    Console.WriteLine("有只猫在叫。。。");
    //触发事件
    CatCryEvent();
    }
    }

    //订阅者类-老鼠
    class Mouse
    {
    public Mouse(Cat cat)
    {
    //注册事件,订阅者老鼠向事件添加事件处理程序
    cat.CatCryEvent += Run;
    }
    //处理事件,事件发生后的处理程序
    void Run()
    {
    Console.WriteLine("老鼠快跑吧!!!");
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    Cat cat1 = new Cat();
    Mouse mouse1 = new Mouse(cat1);
    cat1.Cry();
    }
    }
    }

    二、猫和老鼠的例子(传递数据)

    可以使用System命名空间提供的EventHandler委托类型,所以不需要自己定义委托类型了,它是这么定义的:

    public delegate void EventHandler(object sender, EventArgs e);
    //第一个参数用来保存触发事件的对象的引用。由于是object类,所以可以匹配任何类型的实例
    //第二个参数用来保存状态信息,指明什么类型适用于该应用程序
    为了向事件处理程序的第二个参数传入数据,需要声明一个派生自EventArgs的自定义类来保存需要传入的数据。
    代码如下:

    using System;
    namespace 练习专用
    {
    //自定义一个派生自EventArgs的类,保存数据
    class CryEventArgs : EventArgs
    {
    //存储一个字符串
    public string CatName
    {
    get;
    set;
    }
    }

    //发布者类-猫
    class Cat
    {
    public string CatName
    {
    get;
    set;
    }
    //构造函数,给猫弄个名字
    public Cat(string name)
    {
    this.CatName = name;
    }
    //声明事件,使用自定义类的泛型委托
    public static event EventHandler<CryEventArgs> CatCryEvent;
    //在猫叫的方法中触发事件
    public void Cry()
    {
    Console.WriteLine("有只猫在叫。。。");
    //把猫的名字保存到刚才的自定义类中
    CryEventArgs e = new CryEventArgs();
    e.CatName = this.CatName;
    //触发事件,传递参数
    CatCryEvent(this, e);
    }
    }

    //订阅者类-老鼠
    class Mouse
    {
    public Mouse()
    {
    //注册事件,订阅者老鼠向事件添加事件处理程序
    Cat.CatCryEvent += Run;
    }
    //处理事件,事件发生后的处理程序
    void Run(object sender, CryEventArgs e)
    {
    if (e.CatName == "黑猫警长")
    {
    Console.WriteLine("是黑猫警长,老鼠快特么的跑吧!!!");
    }
    else
    {
    Console.WriteLine("不是黑猫警长,是{0},老鼠不用跑了。。。", e.CatName);
    }
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    Cat cat1 = new Cat("黑猫警长");
    Cat cat2 = new Cat("小猫咪");
    Mouse mouse = new Mouse();
    cat1.Cry();
    Console.WriteLine("===============手动分割线===============");
    cat2.Cry();
    }
    }
    }

    ---------------------
    作者:CRonaldo9399
    来源:CSDN
    原文:https://blog.csdn.net/sinat_32832727/article/details/54800920
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9985539.html
Copyright © 2020-2023  润新知