大白話系列之C#委託與事件講解(二)
什麼是事件?EVENT?點選事件?載入事件?一連串的模糊的概念衝擊著我們弱小的腦袋
那我們首先來看一下比較正統的感念吧:
事件是類在發生其關注的事情時用來提供通知的一種方式。
事件的發生一般都牽扯2個角色
事件發行者(Publisher):一個事件的發行者,也稱作是傳送者(sender),其實就是個物件,這個物件會自行維護本身的狀態資訊,當本身狀態資訊變動時,便觸發一個事件,並通知說有的事件訂閱者。
事件訂閱者(Subscriber):對事件感興趣的物件,也稱為Receiver,可以註冊感興趣的事件,在事件發行者觸發一個事件後,會自動執行這段程式碼。
為了更好的讓大家理解上面的概念,我先什麼都不講,我們先來看一段簡單的程式碼:
程式碼
//釋出者(Publiser)
public class Publisher
{
//宣告一個出版的委託
public delegate void PublishEventHander();
//在委託的機制下我們建立以個出版事件
public event PublishEventHander OnPublish;
//事件必須要在方法裡去觸發,出版社釋出新書方法
public void issue()
{
//如果有人註冊了這個事件,也就是這個事件不是空
if (OnPublish != null)
{
Console.WriteLine("最新一期的《火影忍者》今天出版哦!");
OnPublish();
}
}
}
//Subscriber 訂閱者,無賴小明
public class MrMing
{
//對事件感興趣的事情,這裡指對出版社的書感興趣
public static void Receive()
{
Console.WriteLine("嘎嘎,我已經收到最新一期的《火影忍者》啦!!");
}
}
//Subscriber 訂閱者,悲情人物小張
public class MrZhang
{
//對事件感興趣的事情
public static void Receive()
{
Console.WriteLine("幼稚,這麼大了,還看《火影忍者》,SB小明!");
}
}
class Story
{
public static void Main(string[] args)
{
//例項化一個出版社
Publisher publisher = new Publisher();
//給這個出火影忍者的事件註冊感興趣的訂閱者,此例中是小明
publisher.OnPublish += new Publisher.PublishEventHander(MrMing.Receive);
//另一種事件註冊方式
//publisher.OnPublish += MrMing.Receive;
//釋出者在這裡觸發出版火影忍者的事件
publisher.issue();
Console.ReadKey();
}
}
編譯結果如下
如果童靴們,從上到下仔細看一邊的話,我想應該知道什麼是釋出者,什麼是訂閱者了吧,那至於事件呢
我們先看這句
publisher.OnPublish += new Publisher.PublishEventHander(MrMing.Receive);
這就是小明向出版社訂閱他喜歡看的火影忍者,小張沒有訂閱所以小張沒有收到書,
我們再仔細看看這個賦值語句,是不是似曾相識過呢?是的就是我們在上一講,在講委託宣告的時候,簡直就是一個眸子裡刻出來的嘛
委託賦值:
BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyTicket);
所以,大家不要對事件有什麼好怕的,其實事件的本質就是一個委託鏈,
我們看一下事件的宣告:
//宣告一個出版的委託
public delegate void PublishEventHander();
//在委託的機制下我們建立以個出版事件
public event PublishEventHander OnPublish;
在我們使用事件的時候,必須要宣告對應的委託,而觸發事件,其實就是在使用委託鏈。
好了大家先消化消化這講的內容,我們在下一講裡,我們會講到我們期盼已久的Sender,e兩個神祕的引數了
from: https://www.cnblogs.com/wudiwushen/archive/2010/04/20/1703763.html