以前也断断续续看过关于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之后就等于喊了一嗓子“我进了一辆新车,快来买吧”,客户就会被通知到。