iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
自我挑戰組

C# 和 SQL 探索之路系列 第 17

Day 17: C# 事件 (Event) 的實作

  • 分享至 

  • xImage
  •  

第 17 天 ~ 今天來講事件 Event。
在寫 C# 程式時,多多少少都有碰到應用元件提供的事件 (像是按鈕點下去後,在點擊事件裡寫相關邏輯),今天就來實作簡單的事件 ~

為什麼要實作事件

  • 因為可以降低程式模組間的耦合性。
  • 是一種觀察者模式的實作:觀察者模式中包含發佈者/訂閱者,發佈者要「註冊」和「通知」眾多的訂閱者。訂閱者要提供發佈者一個方法發送通知,發佈者則實作通知的方法。

實作一個包含 Event 的類別

以下使用微軟文件的範例 (見參考資料 3),並加以修改。

  1. 建立一個 class,並在裡面加入 public EventHandler。
public class Countdown
{
    public event EventHandler CountdownCompleted;  
}
  1. 宣告一個 event 發生的函式,函式名稱通常以 On 開頭。
public class Countdown
{
    public event EventHandler CountdownCompleted;   
    protected virtual void OnCountdownCompleted(EventArgs e)
    {
        if (CountdownCompleted != null)
            CountdownCompleted(this, e);
        }
}
  1. 當需要通知 (訂閱者) 事件發生時,呼叫剛剛建立的 On 開頭的方法。
public class Countdown // 簡單的倒數類別
{
    int internalCounter;

    public event EventHandler CountdownCompleted;  

    public Countdown(int n){ // 建構方法,設定要倒數的數字
        internalCounter = n;
    }

    protected virtual void OnCountdownCompleted(EventArgs e)
    {
        if (CountdownCompleted != null)
           CountdownCompleted(this, e); // 發送事件
    }

    public void Decrement() // 倒數,直到 0 時呼叫事件
    {
        internalCounter = internalCounter - 1;
        if (internalCounter == 0)
            OnCountdownCompleted(new EventArgs());
    }
}
  1. 其它類別 (訂閱者) 需要接收通知時,可以建立方法以註冊事件,當事件發生時,會呼叫剛剛建立的方法。建立的方法需要 object 和 EventArgs 作為參數。
public class Receiver{
    // 建立的方法,當事件發生時會呼叫
    public void Tip(object sender , EventArgs eventArgs){
        Console.WriteLine("Tip!!!");
    }

    public void Run(){
        Countdown countdown = new Countdown(3);
        countdown.CountdownCompleted += Tip; // 註冊事件
        countdown.Decrement();
        countdown.Decrement();
        countdown.Decrement(); // 觸發事件
    }
}

此處是自行呼叫 Countdown 的倒數方法,直到其觸發事件為止。該方法若改為執行緒,執行一定次數或時間後,自動觸發事件,更能發揮事件的作用。

參考資料

  1. Unity 事件機制淺談 (C# events, unity events)
  2. 觀念 C# — EventHandler - 我,傑夫。開發人
  3. How to: Implement Events in Your Class

上一篇
Day 16: C# 多工處理: Timer
下一篇
Day 18: C# 事件 (Event) 進階
系列文
C# 和 SQL 探索之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言