zoukankan      html  css  js  c++  java
  • 自定义事件数据类和自定义事件

    要在程序中使用自定义事件,必须满足如下3个条件:

    • 包含事件数据的类(即事件参数类),这个类从System.EventArgs类派生。如果事件不产生数据,则用户可以直接使用System.EventArgs类,否则用户必须定义自己的类。例如如下的代码:
    自定义事件数据类
    public class AlarmEventArgs : EventArgs
    {
    private readonly bool snoozePressed;
    private readonly int nrings;

    //构造函数//
    public AlarmEventArgs(bool snoozePressed, int nrings)
    {
    this.snoozePressed = snoozePressed;
    this.nrings = nrings;
    }

    //定义属性,私有字段nrings//
    public int Nrings
    {
    get { return nrings; }
    }

    //定义属性,私有字段snoozePressed//
    public bool SnoozePressed
    {
    get { return snoozePressed; }
    }
    }
    • 事件代理。同样,如果事件不产生数据,用户可以直接使用System.EventHandler,否则必须声明自己的代码类型,例如下面的代码。

    (注:在.NET框架中,事件代理具有两个参数:事件源(即触发事件的对象)以及事件参数(包含与事件相关的数据)。)

    public delegate void AlarmEventHandler(Object sender, AlarmEventArgs e);
    •  触发事件的类。在这个类中要包含事件声明以及触发事件的方法,例如下面的代码。

    触发事件的类
    //包含事件和触发事件方法的类//
    public class AlarmClock
    {

    //声明事件,它所使用的代理类型为AlarmEventHandler//
    public event AlarmEventHander Alarm;

    //触发事件的方法//
    protected virtual void OnAlarm(AlarmEventArgs e)
    {
    if (Alarm != null)
    {
    //通过代理调用事件处理方法//
    Alarm(this, e);
    }
    }

    }

    定义好包含自定义事件的类后,就可以使用了。下面调用一个包含事件处理方法的类。

    包含事件处理方法的类/
    public class WakeMeUp
    {
    //事件处理方法,在该方法中根据用户的输入来通过事件参数sender
    //设置事件发送者属性//
    public void AlarmRing(Object sender, AlarmEventArgs e)
    {
    //访问自定义事件参数类中定义的数据
    Console.WriteLine(e.AlarmString + "\n");

    //通过事件参数sender来访问触发事件的对象//
    ((AlarmClock)sender).SnoozePressed = true;
    ((AlarmClock)sender).Stop
    = true
    //...
    }
    }

    然后,可以在主程序中分别创建事件发送者实例和事件接收者实例,再绑定事件处理方法,最后触发事件就可以了。

    代码
    static void Main(string[] args)
    {
    //创建事件接收者对象实例//
    WakeMeUp w = new WakeMeUp();

    //创建事件发送者对象实例//
    AlarmClock clock = new AlarmClock();

    //把事件处理方法绑定到发送者的事件上//
    clock.Alarm += new AlarmEventHander(w.AlarmRing);
    // clock.Alarm += w.AlarmRing; //这种绑定方法也可以
    clock.Start(); //触发OnAlarm方法
    }

  • 相关阅读:
    012.Nginx负载均衡
    011.Nginx防盗链
    010.Nginx正反代理
    009.Nginx缓存配置
    附007.Docker全系列大总结
    附024.Kubernetes全系列大总结
    008.Nginx静态资源
    007.Nginx虚拟主机
    006.Nginx访问控制
    005.Nginx配置下载站点
  • 原文地址:https://www.cnblogs.com/qinlixue/p/1924837.html
Copyright © 2011-2022 走看看