• 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");
        }
    }
     
  • 相关阅读:
    VS.NET2013发布网站的时候去掉.cs文件(预编译)(转)
    vs2013发布网站合并程序是出错(ILmerge.merge:error)
    转:c# Linq 的分页[转]
    AStar 路径规划之初级二
    ASttar 路径规划之初级
    AttributeError: module 'tensorflow' has no attribute 'set_random_seed'
    github提示Permission denied (publickey),如何才能解决?
    机器学习-模型评价指标
    pcl-qt使用QVTKWidget 与PCLVisualizer 显示雷达点云
    pcl-设置多线段宽度和颜色
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/7521743.html
Copyright © 2020-2023  润新知