1. 程式人生 > >C#事件の事件解析

C#事件の事件解析

intern 處理機 信息 nta 語句 args handler poi pri

事件(event)是基於windows消息處理機制的類,封裝的更好,讓開發者無須知道底層的消息處理機制,就可以開發出強大的基於事件的應用程序來。
委托(delegate)委托可以理解成為函數指針,不同的是委托是面向對象,而且是類型安全的,並且衍生出Task,Action,Func等各種特殊類型的委托。

事件和委托的關系:
  我們可以把事件編程簡單地分成兩個部分:事件發生的類(書面上叫事件發生器)和事件接收處理的類。事件發生的類就是說在這個類中觸發了一個事件,但這個類並不知道哪個個對象或方法將會加收到並處理它觸發的事件。所需要的是在發送方和接收方之間存在一個媒介。
這個媒介在.NET Framework中就是委托(delegate)。在事件接收處理的類中,我們需要有一個處理事件的方法。
  總體上說,事件是一種特殊的委托。
下面舉例創建自己的事件。
1、首先創建一個自己的EventArgs類。
EventArgs是包含事件數據的類的基類,此類不包含事件數據,在事件引發時不向事件處理程序傳遞狀態信息的事件會使用此類。如果事件處理程序需要狀態信息,則應用程序必須從此類派生一個類來保存數據。
因為在我們鍵盤按鍵事件中要包含按鍵信息,所以要派生一個KeyEventArgs類,來保存按鍵信息,好讓後面知道按了哪個鍵。
internal class KeyEventArgs : EventArgs
{
    private char keyChar;
    public KeyEventArgs( char keyChar ) : base()
    {
        
this.keyChar = keyChar; } public char KeyChar { get { return keyChar; } } }

2、再創建一個事件發生的類KeyInputMonitor,這個類用於監控鍵盤按鍵的輸入並觸發一個事件:
internal class KeyInputMonitor
{
    // 創建一個委托,返回類型為void,兩個參數
    public delegate void KeyDownHandler( object sender, KeyEventArgs e );
    
// 將創建的委托和特定事件關聯,在這裏特定的事件為KeyDown public event KeyDownHandler KeyDown; public void Run() { bool finished = false; do { Console.WriteLine( "Input a char" ); string response = Console.ReadLine(); char responseChar = ( response == "" ) ? : char.ToUpper( response[0] ); switch( responseChar ) { case X: finished = true; break; default: // 得到按鍵信息的參數 KeyEventArgs keyEventArgs = new KeyEventArgs( responseChar ); // 觸發事件 KeyDown( this, keyEventArgs ); break; } }while( !finished ); } }

這裏註意KeyDown( this, KeyEventArgs );一句,這就是觸發事件的語句,並將事件交由KeyDownHandler這個委托來處理,委托指定事件處理方法去處理事件,這就是事件接收方的類的事情了。參數this是指觸發事件的對象就是本身這個對象,keyEventArgs包含了按鍵信息。

3、最後創建一個事件接收方的類,這個類先產生一個委托實例,再把這個委托實例添加到產生事件對象的事件列表中去,這個過程又叫訂閱事件。然後提供一個方法回顯按鍵信息。
internal class EventReceiver
{
    public EventReceiver( KeyInputMonitor monitor )
    {
        // 產生一個委托實例並添加到KeyInputMonitor產生的事件列表中
        monitor.KeyDown += new KeyInputMonitor.KeyDownHandler( this.OnKeyDown );
    }
    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        // 真正的事件處理函數
        Console.WriteLine( "Capture key: {0}", e.KeyChar );
    }
}

4、看一下如何調用
public class MainEntryPoint
{
    public static void Start()
    {
        // 實例化一個事件發送器
        KeyInputMonitor monitor = new KeyInputMonitor();
        // 實例化一個事件接收器
        EventReceiver eventReceiver = new EventReceiver( monitor );
        // 運行
        monitor.Run();
    }
}



C#中使用事件需要的步驟:
1.創建一個委托
2.將創建的委托與特定事件關聯(.Net類庫中的很多事件都是已經定制好的,所以他們也就有相應的一個委托,在編寫關聯事件處理程序--也就是當有事件發生時我們要執行的方法的時候我們需要和這個委托有相同的簽名)
3.編寫事件處理程序
4.利用編寫的事件處理程序生成一個委托實例
5.把這個委托實例添加到產生事件對象的事件列表中去,這個過程又叫訂閱事件

註意:event起到限制作用。 事件是特殊類型的多路廣播委托,僅可從聲明它們的類或結構(發行者類)中調用。如果其他類或結構訂閱了該事件,則當發行者類引發該事件時,會調用其事件處理程序方法。

C#事件の事件解析