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

C# 基礎概念之事件:自訂事件與事件資料傳遞完整實作

     編輯:關於C語言

事件 是 C# 程式設計模型中的關鍵概念,掌握事件機制有助於深入理解 C# 程式執行流程。事件本質上是類別或物件發生特定動作,並通知其他類別或物件做出回應——這實踐了觀察者模式。

核心術語

  • 事件源:引發事件的物件
  • 事件監聽者:註冊並處理事件的物件

WinForms 內建事件範例

雙擊按鈕進入 Click 事件處理器:

private void button1_Click(object sender, EventArgs e)
{
    // sender = 事件源,e = 事件傳遞資料
}

設計器代碼顯示註冊:

this.button1.Click += new System.EventHandler(this.button1_Click);

EventHandler 為委派型別,詳見「C# 基礎概念之委派」。

自訂事件四步驟實作

步驟 1:事件源定義事件

public event EventHandler myEvent;

步驟 2:監聽者訂閱事件

this.myEvent += new EventHandler(MyEventHandler);

步驟 3:撰寫事件處理邏輯

private void MyEventHandler(object sender, EventArgs e)
{
    MessageBox.Show("myevent is raised.......");
}

步驟 4:事件源引發事件

if (myEvent != null)
{
    myEvent(this.button1, new EventArgs());
}

完整自訂事件範例

public partial class Form1 : Form
{
    public event EventHandler myEvent;

    public Form1()
    {
        InitializeComponent();
        this.myEvent += new EventHandler(MyEventHandler);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("button1_Click");
        if (myEvent != null)
        {
            myEvent(this.button1, new EventArgs());
        }
    }

    private void MyEventHandler(object sender, EventArgs e)
    {
        MessageBox.Show("myevent is raised.......");
    }
}

進階:自訂事件資料傳遞

實務常需傳遞豐富資料,需建立繼承 EventArgs 的類別與自訂委派。

事件源端

// 自訂委派
public delegate void MyEventHandler(object sender, MyEventArgs e);

public partial class AddGrade : Form
{
    public event MyEventHandler myCustomEvent;

    public AddGrade() { InitializeComponent(); }

    private void button1_Click(object sender, EventArgs e)
    {
        if (myCustomEvent != null)
        {
            myCustomEvent(this, new MyEventArgs() { Message = this.textBox1.Text });
        }
    }
}

// 自訂事件資料
public class MyEventArgs : EventArgs
{
    public string Message { get; set; }
}

監聽者端

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

    private void button1_Click(object sender, EventArgs e)
    {
        AddGrade addGrad = new AddGrade();
        addGrad.myCustomEvent += new MyEventHandler(addGrad_myCustomEvent);
        addGrad.Show();
    }

    void addGrad_myCustomEvent(object sender, MyEventArgs e)
    {
        MessageBox.Show(e.Message);
    }
}

關鍵最佳實務

  • Null 檢查:引發前必檢查 != null
  • 標準簽名:遵循 (object sender, EventArgs e)
  • 事件資料不可變:EventArgs 衍生類建議設計為不可變
  • 執行緒安全:多執行緒下建議 var handler = myEvent; handler?.Invoke(...)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved