標籤:c# event 事件
本篇文章我們來討論C#中的事件。委託是事件的基礎,瞭解委託請點擊C#委託 。
我們先來看下面這個類
public class Person{ public string Name { get; set; } public int Age { get; set; } public void ZhuangBi() { string topic="I am newbility"; Console.WriteLine(topic); }}
這個Person類有一個ZhuangBi方法,大家都知道,一個人關起門來裝逼太沒意思,所以我們希望在執行ZhuangBi方法時通知感興趣的人,讓他們知道我們在裝逼。問題是怎麼通知感興趣的人呢?觀察者模式可以將感興趣的人抽象為介面,在Person類內部維護一個介面集合,在執行ZhuangBi方法時可以通知到所有感興趣的人,可這不在我們討論的範圍內。這次我們通過C#的事件機制來實現對外界發出通知。
想用事件,必須先有委託,我們來定義一個委託
public delegate void ZhuangBi_Handler(string name, string topic);
有了委託之後,我們來改寫Person類
public class Person{ public Person(string name) { this.Name = name; } public string Name { get; set; } public int Age { get; set; } public event ZhuangBi_Handler ZhuangBi_Completed; public void ZhuangBi() { string topic = "I am newbility"; Console.WriteLine(topic); if (ZhuangBi_Completed != null) { ZhuangBi_Completed(Name, topic); } }}
我們定義了一個ZhuangBi_Handler 類型的事件 ZhuangBi_Completed,在裝逼完成後,我們來對外界發出通知。
下面我們編寫一個類,來註冊(或者叫訂閱)這個事件。我們寫一個粉絲類
public class Funs{ static void Main(string[] args) { Person person = new Person("kai_ge"); person.ZhuangBi_Completed += person_ZhuangBi_Completed; person.ZhuangBi(); } private static void person_ZhuangBi_Completed(string name, string topic) { Console.WriteLine("哇,{0}又開始裝逼了,他說:{1}", name, topic); }}
我們在類內部定義一個事件對象,可以被很多個物件註冊。當類的內部發生特定的行為時,我們在類內部可以向所有外部的註冊者發送通知。
我們的這個類是如此的成功,在社會上產生了巨大的影響,也包括下面這個類
public class PoliceMan{ static void Main(string[] args) { Person person = new Person("kai_ge"); person.ZhuangBi_Completed += person_ZhuangBi_Completed; person.ZhuangBi(); } static void person_ZhuangBi_Completed(string name, string topic) { Console.WriteLine(name + ",我們懷疑你跟一起裝逼案有關,請跟我們到警局接受調查,證據為:" + topic); }}
備忘:
1. 兩個註冊者都在Main函數中定義,如果你把代碼複製到本地編譯,兩個註冊者不能同時編譯,你可以把一個注釋掉。我之所以這麼寫,是為了降低訂閱類的複雜性,否則又得定義一大堆類,這樣我們的主題就跑偏了。
2. 裝逼有風險,雨天要謹慎。
C# 事件