C# event 事件學習


C# event 事件學習

運行環境:Window7 64bit,.NetFramework4.61,C# 6.0; 編者:烏龍哈里 2017-02-26


章節:

  • 簡單事件編寫
  • 模擬 WPF 控件傳遞消息

正文:

一、簡單事件編寫:

對於 C# 中的事件 event ,我的理解是:通過委托(delegate)來調用另一個類的 method
比如下面有個電台的類:

class Station
{
    private string info;
    public Station(string s)=>info=s;
    public void Broadcast()=> Console.WriteLine(info);
}

現在手頭上我有個 Radio 的類,我怎么直接調用 Station.Broadcast() 呢?
方法一,可以用反射(Reflaction),但是這樣太笨重了。
方法二,在 Radio 類中直接寫 Station 的實例,比如 station1.Broadcast() ,但這樣的設計很不靈活,萬一碰到另外一個實例名叫 station2 的就歇菜了。
這時候就需要事件(event)了。下來我們就按步驟一步一步來建立一個 Radio 的類:

1、聲明一個委托 delegate 指向想調用的方法
這里是 Broadcast()。寫委托的時候注意參數必須和要調用的方法類型一致。

public delegate void StationBroadcast();

2、用關鍵字 event 聲明這個委托的事件。

public event StationBroadcast PlayEvent;

3、寫一個方法來調用這個事件。

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 !
*/


二、模擬 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 應用中的控件消息傳遞。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM