將不確定變成確定~我想監視我的對象,如果是某個值,就叫另一些方法自動運行
名稱有點饒,不是很好理解,但我喜歡這種大白話,不喜歡書所翻譯過來的話,呵呵!
今天要把一個不確定的問題解決,問題是:一個程序中,有一個屬性,如果它為true時,我希望把另一些方法自動運行,這是可以通過訂閱事件來實現的,對嗎?經過我的測試確實是這樣的,呵呵。
事件一個一直叫我們頭痛的話題,一個能不用就不用的東西,我們程序員為什么那么怕“事件”呢?我來分析幾個原因
1 對本身的概念不是很理解
2 對它的作用不是很清晰,可能書上說不到點上,個人認為
3 平時用的少,所以對它更加陌生
今天,我就和大家一起再學習一個C#的事件
一說事件,就不行不說委托,這兩者到底是什么關系呢,在我看來,委托就是一個類,而事件就是這個類的一個實例,呵呵,這樣大家就容易理解了吧
事件由事件數據源,事件所發生的類和事件訂閱者們組成,“事件訂閱者們”就是說,一個事件可以被多個訂閱都訂閱。
開始寫代碼了,代碼最能說明問題:
事件源類:
1 /// <summary> 2 /// 事件源 3 /// </summary> 4 internal class KeyEventArgs : EventArgs 5 { 6 private char keyChar; 7 public KeyEventArgs(char keyChar) 8 : base() 9 { 10 this.keyChar = keyChar; 11 } 12 13 public char KeyChar 14 { 15 get 16 { 17 return keyChar; 18 } 19 } 20 }
一都是以EventArgs 結尾的,其中EventArgs 本身它是所有事件源類的基類,它不提供任何事件源信息,如果有個性化的事件信息,需要去派生它
接下來看,發生事件的類,我們的事件就在這里發生,在什么時候,什么情況下發生,都來自這里。
1 /// <summary> 2 /// 事件發生的類 3 /// </summary> 4 internal class KeyInputMonitor 5 { 6 // 創建一個委托,返回類型為avoid,兩個參數 7 public delegate void KeyDownEventHandler(object sender, KeyEventArgs e); 8 // 將創建的委托和特定事件關聯,在這里特定的事件為OnKeyDown 9 public event KeyDownEventHandler OnKeyDown; 10 11 public void Run() 12 { 13 bool finished = false; 14 do 15 { 16 Console.WriteLine("Input a char"); 17 string response = Console.ReadLine(); 18 19 char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]); 20 switch (responseChar) 21 { 22 case 'X': 23 finished = true; 24 break; 25 default: 26 // 得到按鍵信息的參數 27 KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar); 28 // 觸發事件 29 OnKeyDown(this, keyEventArgs); 30 break; 31 } 32 } while (!finished); 33 } 34 }
功能就是輸入一個字符,當為X時,退出,當不為X時,去觸發一個事件,事件源數據為“輸入的字符”
到這里,這個事件還沒有任何功能,就相當于,我去賣東西,東西已經擺在臺上了,但還沒有人來買,好,現在是時候有顧客來了
1 /// <summary> 2 /// 顯示中文的接收類 3 /// </summary> 4 internal class EventReceiverForChina 5 { 6 public EventReceiverForChina(KeyInputMonitor monitor) 7 { 8 // 產生一個委托實例并添加到KeyInputMonitor產生的事件列表中 9 monitor.OnKeyDown += new KeyInputMonitor.KeyDownEventHandler(this.Echo); 10 } 11 private void Echo(object sender, KeyEventArgs e) 12 { 13 Console.WriteLine("您輸入的字條是: {0}", e.KeyChar); 14 } 15 }
這里訂閱事件時,我們使用+=就可以了,事實上就是建立一個委托類型的新事件實例而以。
在前臺調用時,可以這樣:
1 // 實例化一個事件發送器,并聲明一個EventReceiverForChina類型的訂閱者 2 KeyInputMonitor monitor = new KeyInputMonitor(); 3 EventReceiverForChina eventReceiverForChina = new EventReceiverForChina(monitor); 4 monitor.Run();
運行的結果就是當你去Run()時,eventReceiverForChina 類型時的某個方法也被執行了,怎么樣,實現了我們今天的話題了吧,其實這就是事件的訂閱機制,事實上在軟件開發中非常有用。 需要注意的是,一般事件的返回類型都是void,當然,這也是很正常的,因為事件就是去做某些事件,它不知道管后果的。呵呵。
祝您晚——來個好夢吧!
回到目錄
浙公網安備 33010602011771號