zoukankan      html  css  js  c++  java
  • C#事件の.net下的EventArgs和EventHandler

    事件参数(EventArgs)

    .Net框架里边提供的一个委托EventHandler来Handle事件。

    一样,搞一个场景(这个场景是书里的):买车。经销商(CarDealer)会上新车(NewCar)事件,这个事件会由买车的顾客(Comsumer)订阅,一旦有新车出来他们就会来光顾。在这里,由于需要详细的车的信息,所以使用前面提到的不带参数的方法就比较麻烦,我们重新定义一个委托(delegate)和事件参数(EventArgs)。

    1、事件参数(CarInfoEventArgs)

    从.Net提供的EventArgs里派生出来,包含车辆名字的属性

    复制代码
    public class CarInfoEventArgs : EventArgs
    {
        public string Car { get; private set; }
    
        public CarInfoEventArgs(string car)
        {
            this.Car = car;
        }
    }
    复制代码

    2、事件(NewCarInfo)

    这里使用.Net自带的委托EventHandler来声明一个事件,相应的,这个事件的处理程序就必须使用这个委托对应的参数来构建

    public event EventHandler<CarInfoEventArgs> NewCarInfo;

    注意,这是一个泛型委托,在这里指定了参数的类型为CarInfoEventArgs,EventHandler的定义如下:

    public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
        where TEventArgs : EventArgs

    可以看到这个委托包含两个参数:一个object类型,一个泛型参数,并且这个泛型参数被限制为EventArgs或EventArgs派生的类型

    3、完整的对象

    CarDealer

    复制代码
    public class CarDealer
    {
        public event EventHandler<CarInfoEventArgs> NewCarInfo;
    
        // 触发事件
        public void NewCar(string car)
        {
            Console.WriteLine($"CarDealer, new car {car}");
            if (NewCarInfo != null)
            {
                NewCarInfo(this, new CarInfoEventArgs(car));
            }
        }
    }
    复制代码

    Consumer

    复制代码
    public class Consumer
    {
        public string Name { get; private set; }
    
        public Consumer(string name)
        {
            this.Name = name;
        }
    
        public void NewCarIsHere(object sender, CarInfoEventArgs e)
        {
            Console.WriteLine($"{name}: car {e.Car} is new");
         }
    }
    复制代码

    4、具体的实现

    复制代码
    public class Program
    {
        static void Main()
        {
            var dealer = new CarDealer();
    
            var michael = new Consumer("Michael");
            dealer.NewCarInfo += michael.NewCarIsHere;
    
            dealer.NewCar("Mercedes");
                
            var nick = new Consumer("Nick");
            dealer.NewCarInfo += nick.NewCarIsHere;
    
            dealer.NewCar("Ferrari");
    
            dealer.NewCarInfo -= michael.NewCarIsHere;
            dealer.NewCar("Toyota");
        }
    }
     
  • 相关阅读:
    通过理解List和IList的区别,加深对接口回调的理解
    mysql学习笔记之mysqlparameter(摘)
    MSSQL表中字段更新后,视图中的字段不更新的解决办法
    如何设置firefox,使其可以支持剪贴板
    CSS图片下载器
    VS2008下.NET 单元测试工具 NUnit2.5 配置与集成方法
    discuz x1.5通过uchome注册后免激活补丁(自动激活)
    (转)七秘诀工作效率与薪水翻番
    TRIGGER OF ORACLE
    SQL LOADER 的使用
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/7521743.html
Copyright © 2011-2022 走看看