首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

叩響 C# 之門:初學者自訂事件完整教學 (含事件參數傳遞)

     編輯:關於C#

事件機制六步曲

  1. 宣告事件委派型別
  2. 宣告事件
  3. 編寫激發事件方法 (OnXxx)
  4. 編寫事件處理器
  5. 註冊事件處理器 (+=)
  6. 在適當條件下激發事件

案例:看門狗與主人

半夜小偷來,狗吠觸發 `Alarm` 事件,主人接收並處理。

基礎版:無參數事件


// 事件發送者
public class Dog {
    // 1. 委派
    public delegate void AlarmEventHandler(object sender, EventArgs e);
    // 2. 事件
    public event AlarmEventHandler Alarm;

    // 3. 激發方法
    public void OnAlarm() {
        if (Alarm != null) {
            Console.WriteLine("\n狗報警: 有小偷進來了,汪汪~~~~~~~");
            Alarm(this, EventArgs.Empty);
        }
    }
}

// 事件接收者
public class Host {
    // 4. 處理器
    void HostHandleAlarm(object sender, EventArgs e) {
        Console.WriteLine("主人: 抓住了小偷!");
    }
    // 5. 註冊
    public Host(Dog dog) => dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
}

// 6. 測試
class Program {
    static void Main() {
        var dog = new Dog();
        var host = new Host(dog);

        DateTime now = new DateTime(2008, 12, 31, 23, 59, 50);
        DateTime midnight = new DateTime(2009, 1, 1, 0, 0, 0);

        Console.WriteLine("時間一秒一秒地流逝...");
        while (now < midnight) {
            Console.Write($"當前時間: {now:HH:mm:ss}\r");
            Thread.Sleep(1000);
            now = now.AddSeconds(1);
        }
        dog.OnAlarm(); // 午夜觸發
        Console.ReadKey();
    }
}

進階版:自訂事件參數傳遞小偷人數


// 自訂事件參數
public class ThiefCountEventArgs : EventArgs {
    public int Count { get; }
    public ThiefCountEventArgs(int count) => Count = count;
}

public class Dog {
    public delegate void AlarmEventHandler(object sender, ThiefCountEventArgs e);
    public event AlarmEventHandler Alarm;

    public void OnAlarm(ThiefCountEventArgs e) {
        if (Alarm != null) {
            Console.WriteLine($"\n狗報警: 有 {e.Count} 個小偷進來了!");
            Alarm(this, e);
        }
    }
}

public class Host {
    void HostHandleAlarm(object sender, ThiefCountEventArgs e) {
        if (e.Count <= 1)
            Console.WriteLine("主人: 抓住了小偷!");
        else
            Console.WriteLine($"主人: 打 110 報警,我家來了 {e.Count} 個小偷!");
    }
    public Host(Dog dog) => dog.Alarm += HostHandleAlarm; // 方法群組轉換簡化
}

// 測試
dog.OnAlarm(new ThiefCountEventArgs(3)); // 輸出: 打 110...

關鍵慣例

  • 委派命名以 EventHandler 結尾
  • 激發方法命名 On + 事件名 (如 OnAlarm)
  • 事件處理器簽名必須與委派一致
  • 標準雙參數:object sender (發送者)、EventArgs e (參數)
  • .NET 內建 100+ 種 EventArgs 衍生類,多數場景可直接用

圖解事件流程

狗與主人互動示意
事件觸發流程
事件註冊與處理器關係
註冊與處理器關係
事件參數傳遞示意
事件參數在發送者與接收者間傳遞

自訂事件是 C# 解耦的核心利器。掌握「委派→事件→激發→處理→註冊」標準流程,並善用自訂 EventArgs 攜帶業務資料,即能建構出彈性、可擴充的事件驅動架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved