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");
        }
    }
     
  • 相关阅读:
    Finite Difference Method with Mathematica
    评论
    The Woman in Red Is Seen as a Threat by Other Wom
    Why Does Everyone Else Appear to Be Succeeding?
    The Sorrows of Young Werther
    【洛谷P5607】无力回天 NOI2017
    【YbtOJ#532】往事之树
    【YbtOJ#582】大收藏家
    【牛客Wannafly挑战赛23 F】计数
    【YbtOJ#573】后缀表达
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/7521743.html
Copyright © 2011-2022 走看看