C# event 事件學習函數
運行環境:Window7 64bit,.NetFramework4.61,C# 6.0; 編者:烏龍哈里 2017-02-26學習
章節:spa
正文:設計
1、簡單事件編寫:事件
對於 C# 中的事件 event ,個人理解是:經過委託(delegate)來調用另外一個類的 method。
好比下面有個電臺的類: string
class Station
{
private string info;
public Station(string s)=>info=s;
public void Broadcast()=> Console.WriteLine(info);
}
it
如今手頭上我有個 Radio 的類,我怎麼直接調用 Station.Broadcast() 呢?
方法一,能夠用反射(Reflaction),可是這樣太笨重了。
方法二,在 Radio 類中直接寫 Station 的實例,好比 station1.Broadcast() ,但這樣的設計很不靈活,萬一碰到另一個實例名叫 station2 的就歇菜了。
這時候就須要事件(event)了。下來咱們就按步驟一步一步來創建一個 Radio 的類: io
一、聲明一個委託 delegate 指向想調用的方法。
這裏是 Broadcast()。寫委託的時候注意參數必須和要調用的方法類型一致。 event
public delegate void StationBroadcast();
ast
二、用關鍵字 event 聲明這個委託的事件。
public event StationBroadcast PlayEvent;
三、寫一個方法來調用這個事件。
public void OnPlay()
{
PlayEvent();
Console.WriteLine();
}
好了,到這步爲止,咱們就設好一個能調用 Station.Broadcast() 的類 Radio。下面是整個 Radio 類的寫法:
class Radio
{
public delegate void StationBroadcast();
public event StationBroadcast PlayEvent;
public void OnPlay()
{
PlayEvent();
Console.WriteLine();
}
}
下來就是如何運用了。Radio 的 PlayEvent 要加載和棄掉事件,用符號 +=,-=。
示例1:
Station fm101 = new Station("fm101 is on air ~~");
Station fm97 = new Station("~~ here is fm97");
Radio radio = new Radio();
//只加載fm101
radio.PlayEvent += fm101.Broadcast;
radio.OnPlay();
//只加載fm97
radio.PlayEvent -= fm101.Broadcast;
radio.PlayEvent += fm97.Broadcast;
radio.OnPlay();
//增長一個 fm101
radio.PlayEvent+=fm101.Broadcast;
radio.OnPlay();
//多加載一次fm101
radio.PlayEvent += fm101.Broadcast;
radio.OnPlay();
/*運行結果:
fm101 is on air ~~
~~ here is fm97
~~ here is fm97
fm101 is on air ~~
~~ here is fm97
fm101 is on air ~~
fm101 is on air ~~
*/
這樣寫,只要符合返回值爲 void 的,不帶參數的函數,無論叫什麼名字,咱們均可以調用。
好比咱們這個 Radio 更高級些,還能放MP3,增長一個 MP3的類:
class MP3
{
public void Play() => Console.WriteLine("yoyo !");
}
下來咱們同樣調用:
MP3 mp3 = new MP3();
radio.PlayEvent += mp3.Play;
radio.OnPlay();
/*運行結果:
yoyo !
*/
2、模擬 WPF 控件傳遞消息:
在寫 Wpf 程序的時候,Button 的響應 Click 事件通常以下:
private void Button_Click(object sender, RoutedEventArgs e);
下來咱們就模擬一下這個響應的過程。如下程序都是控制檯應用,並非 Wpf 應用。
首先有個消息類供控件來傳遞:
class MsgArgs
{
public string str;
}
接下來 模擬窗口類 Win 裏面有控件 Button,還有發生按鈕 click 改變消息 MsgArgs 內容的方法:
class Win
{
public Button button1;
public void OnClick(object sender,MsgArgs e)
{
e.str = "button click";
}
}
而後根據上面所說的步驟,創建一個 Button 類:
class Button
{
public delegate void OnClickHandler(object o,MsgArgs e);
public event OnClickHandler OnClick;
public void Click(object sender,MsgArgs e)
{
OnClick(sender,e);
Console.WriteLine(e.str);
}
}
接下來就是具體調用了,以下:
Win win = new Win();
Button btn = new Button();
MsgArgs msg = new MsgArgs();
win.button1 = btn;
btn.OnClick += win.OnClick;
btn.Click(btn, msg);
模擬完畢,簡單再現了 Wpf 應用中的控件消息傳遞。