登山-C#-事件

来源:互联网 发布:kahn算法 编辑:程序博客网 时间:2024/06/05 15:27

以前也断断续续看过关于C#的事件的知识,长时间不用忘记了,总结下来还是自己学习得不够深刻,不能有自己的理解。

这次静下心来仔细学了一下,有了一些自己的理解,记录一下。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EventLearn{    //這個地方應該是放一些要通知用戶的內容    public class CarInfoEventArgs : EventArgs    {        public CarInfoEventArgs(string car)        {            this.Car = car;        }        public string Car { get; private set; }//除了這個屬性,我們還可以放一些其他的內容。    }        public class CarDealer    {        public event EventHandler<CarInfoEventArgs> NewCarInfo;        /*NewCarInfo是事件;作為一個約定,事件一般有兩個參數,第一個是一個對象,包含事件的發送者,第二個提供了事件的相關信息         *這個事件供用戶來訂閱         */        //NewCar用來觸發事件,操作在商家手裡        public void NewCar(string car)        {            Console.WriteLine("CarDealer,new car {0}",car);            if (NewCarInfo != null)            {                NewCarInfo(this, new CarInfoEventArgs(car));            }        }    }    public class Consumer    {        private string name;        public Consumer(string name)        {            this.name = name;        }        //將NewCarIsHere視為用戶訂閱的工具,這是實現了委託的方法。        public void NewCarIsHere(object sender, CarInfoEventArgs e)        {            Console.WriteLine("{0}:car is new", name, e.Car);//除了簡單的輸出語句,其實可以根據e中的內容做更複雜的事情。        }    }    class Program    {        static void Main(string[] args)        {            var dealer = new CarDealer();            var michael = new Consumer("Michael");            dealer.NewCarInfo += michael.NewCarIsHere;//這應當是用多播委託,實現方法返回值為void            dealer.NewCar("Mercedes");            var nick = new Consumer("nick");            dealer.NewCarInfo += nick.NewCarIsHere;            dealer.NewCar("Ferrari");            dealer.NewCarInfo -= michael.NewCarIsHere;//取消監聽            dealer.NewCar("Toyota");        }    }}

事件,可以想象成---汽车商家CarDealer进了一辆新车,他想把这个消息告诉他的顾客。顾客想要收到这个好消息自然要有一个渠道来获得。他们之间的联系就在于NewCarInfo这个事件了。

类CarInfoEventArgs ,就是一个放置消息内容的地方,比我们可以放新车的品牌,颜色,价格等信息。这上面的程序只放置了Car这个属性代表品牌。必须继承自EventArgs。

CarDealer类中的public event EventHandler<CarInfoEventArgs> NewCarInfo;实质上是一个委托的简写。

在消费者Consumer类中写了一个NewCarIsHere的方法,可以视为委托的一个实现方法。

在Main函数中我们看到了多播委托,使得用户订阅或是退订汽车商家的消息。dealer一调用NewCar之后就等于喊了一嗓子“我进了一辆新车,快来买吧”,客户就会被通知到。




0 0