C#總結(二)事件Event 介紹總結

mpsky發表於2021-09-09

最近在總結一些基礎的東西,主要是學起來很難懂,但是在日常又有可能會經常用到的東西。前面介紹了 C# 的 AutoResetEvent的使用介紹, 這次介紹事件(event)。

事件(event),對於初學者來說,確實比較神秘,難懂。但是在日常程式設計過程中卻經常遇到。事件使用得當,會讓你的程式碼更加整潔,也能少些很多程式碼。

一、Event事件,是一種封裝過的委託。

它擁有以下三要素:
  1. 事件發行者:達到某些條件時激發事件的物件
  2. 事件訂閱者:訂閱事件並對事件發生時進行處理的物件
  3. 定義發行者和訂閱者關係,一個發行者可能會有多個訂閱者。
  事件發行者和事件訂閱者透過委託(delegate) 來實現傳送方和接收方的事件觸發。

它擁有哪些好處:

在以往我們編寫訂閱這類程式中,往往採用等待機制,為了等待某件事情的發生,需要不斷地檢測事情什麼時候發生,而透過事件(event),可以大大簡化了這種過程:
  1. 使用事件,可以很方便地確定程式執行順序。
  2. 當事件驅動程式等待事件時,它不佔用很多資源。事件驅動程式與過程式程式最大的不同就在於,程式不再不停地檢查輸入裝置,而是待著不動,等待訊息的到來,每個輸入的訊息會被排進佇列,等待程式處理它。如果沒有訊息在等待,則程式會把控制交回給作業系統,以執行其他程式。
  3. 事件簡化了程式設計。事件訂閱者只是簡單地將訊息傳送給事件發行者,由發行者的事件驅動程式確定事件的處理方法。不必知道程式的內部訂閱觸發機制,只是需要知道如何傳遞訊息即可。

二、事件和委託的區別

1.委託允許直接透過委託去訪問相應的處理函式,而事件只能透過公佈的回撥函式去呼叫,

2.事件只能透過“+=”,“-=”方式註冊和取消訂戶處理函式,而委託除此之外還可以使用“=”直接賦值處理函式。

三、事件的宣告(Event)

在類的內部宣告事件,首先必須宣告該事件的委託型別。例如:

public delegate void NumManipulationHandler(NumEventArgs e);

然後,宣告事件本身,使用 event 關鍵字:

    // 基於上面的委託定義事件
    public event NumManipulationHandler ChangeNum;

上面的程式碼定義了一個名為 NumManipulationHandler 的委託和一個名為 ChangeNum 的事件,該事件是在某個值生成的時候會呼叫委託事件。

四、例項
public class Program
{
    public static void Main()
    {

        NumEvent even = new NumEvent(0);
        even.ChangeNum += EventAction.Action;

        even.SetValue(7);
        even.SetValue(11);

        System.Console.ReadKey();
    }
}

public class NumEvent
{
    private int value;

    public delegate void NumManipulationHandler(NumEventArgs e);

    public event NumManipulationHandler ChangeNum;

    public virtual void OnChangeNum(NumEventArgs e)
    {
        ChangeNum?.Invoke(e);
    }

    public NumEvent(int n)
    {
        SetValue(n);
    }

    public void SetValue(int n)
    {
        if (value != n)
        {
            NumEventArgs e = new NumEventArgs(n);
            value = n;
            OnChangeNum(e);
        }
    }
}

public class EventAction
{
    public static void Action(NumEventArgs e)
    {
        System.Console.WriteLine("value : " + e.value);
    }
}

public class NumEventArgs : EventArgs
{
    public int value;
    public NumEventArgs(int _value)
    {
        this.value = _value;
    }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1806/viewspace-2808194/,如需轉載,請註明出處,否則將追究法律責任。

相關文章