iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
自我挑戰組

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

Day 18: C# 事件 (Event) 進階

  • 分享至 

  • xImage
  •  

嗨嗨,今天接著介紹事件的進階用法 ~

在事件發生時加入參數

建立新的類別,繼承 EventArgs 類別,以夾帶不同類型的資料至 EventHandler 中。
以下是範例程式碼。

public class CountdownEventArgs:EventArgs // 新的 EventArgs 類別
{
    public string name; // 加入名稱做為簡單的示範

    public CountdownEventArgs(string name){
        this.name = name;
    }
}
    
public class Countdown
{
    int internalCounter;
    string name;

    public delegate void CountDownEventHandler(object sender, CountdownEventArgs e);  // 建立一個自訂的 EventHandler 委派
    public event CountDownEventHandler? CountdownCompleted; // 自訂的 EventHandler

    public Countdown(int n, string name){ // 因示範緣故,直接傳入名稱
        internalCounter = n;
        this.name = name;
    }

    protected virtual void OnCountdownCompleted(CountdownEventArgs e) // 參數類型改為 CountdownEventArgs
    {
        if (CountdownCompleted != null)
            CountdownCompleted(this, e);
    }

    public void Decrement()
    {
        internalCounter = internalCounter - 1;
        if (internalCounter == 0)
            OnCountdownCompleted(new CountdownEventArgs(name)); // 參數類型改為 CountdownEventArgs
    }
}

public class Receiver{
    public void Tip(object? sender , CountdownEventArgs eventArgs){ // 註冊的方法也要改為 CountdownEventArgs
        Console.WriteLine(eventArgs.name + ": Tip!!!");
    }

    public void Run(){
        Countdown countdown = new Countdown(3, "Example");
        countdown.CountdownCompleted += Tip;
        countdown.Decrement();
        countdown.Decrement();
        countdown.Decrement(); // 觸發事件: 結果為 Example: Tip!!!
    }
}

範例程式碼

使用事件要注意 …

在 Static Class 實作事件

需要在 Static Class 內實作事件時和一般事件的宣告類似,額外加入 static 關鍵字即可。

事件特性

可以多個方法註冊一個事件,當事件發生時,所有註冊該事件的方法都會被觸發。


上一篇
Day 17: C# 事件 (Event) 的實作
下一篇
Day 19: C# 引用第三方程式: DLLImport
系列文
C# 和 SQL 探索之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言