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

C# 事件與委派入門範例:汽車油量預警機制

     編輯:關於C#

核心概念

  • 委派:方法簽章的型別安全封裝,類似 C++ 函數指標但物件導向、安全。
  • 事件:基於委派的發布/訂閱機制,發布者觸發,訂閱者響應,解耦雙方。
  • EventArgs:攜帶事件資料的容器,慣例繼承 System.EventArgs。

完整程式碼

using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1() { InitializeComponent(); }

    private void button1_Click(object sender, EventArgs e)
    {
        Car car = new Car();
        car.OnOilWarning += OilWarning; // 訂閱事件
        car.FillOil(5);                 // 加油 5 公升
        car.Startup();                  // 嘗試啟動
    }

    // 事件處理器
    public void OilWarning(object sender, OilEventArgs e)
    {
        MessageBox.Show($"監測到汽車油量異常,當前油量:{e.OilMass} 公升");
    }
}

// 1. 定義委派型別
public delegate void OilEventHandler(object sender, OilEventArgs e);

// 2. 定義事件參數
public class OilEventArgs : EventArgs
{
    public int OilMass { get; }
    public OilEventArgs(int oilMass) { OilMass = oilMass; }
}

// 3. 發布者:汽車類別
public class Car
{
    private int _oilMass = 0;

    // 定義事件
    public event OilEventHandler OnOilWarning;

    public void FillOil(int oilMass) => _oilMass = oilMass;

    public void Startup()
    {
        if (_oilMass < 10)
        {
            // 觸發事件:傳送 this 與事件參數
            OnOilWarning?.Invoke(this, new OilEventArgs(_oilMass));
        }
    }
}

執行流程圖解

  1. 建立 Car 實例。
  2. Form1 將 OilWarning 方法註冊至 car.OnOilWarning。
  3. 呼叫 FillOil(5) 設定油量。
  4. 呼叫 Startup(),判斷油量 < 10 → 觸發事件。
  5. 事件調用 OilWarning,彈出訊息框顯示油量。

關鍵語法細節

  • event 關鍵字限制外部只能 +=/-=,不能直接 = 或 Invoke,保護封裝性。
  • ?.Invoke (C# 6) 為空條件運算子,避免無訂閱者時拋出 NullReferenceException。
  • 慣例:委派名稱以 EventHandler 結尾,參數為 (object sender, TEventArgs e)。

進階延伸

  • 標準事件模式:EventHandler<TEventArgs> 泛型委派,免自訂委派型別。
  • 弱事件模式:避免訂閱者未解除導致記憶體洩漏(WeakEventManager)。
  • 非同步事件:async void 處理器或 Task 回傳型別。

結語

事件是 C# 實現觀察者模式的原生支援。掌握「定義委派 → 定義參數 → 宣告事件 → 觸發事件 → 訂閱處理」五步驟,即可輕鬆構建鬆耦合的元件通訊架構。

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