C 事件機制及響應方法

2021-08-30 11:57:46 字數 3272 閱讀 9145

1.委派的實現過程。

首先來看一下委派,委派其實就是方法的傳遞,並不定義方法的實現。事件其實就是標準化了的委派,為了事件處理過程特製的、稍微專業化一點的組播委派(多點委派)。下面舉乙個例子,我覺得把委派的例子和事件的例子比較,會比較容易理解。

using system; 

class class1

public static int add(int i1,int i2)

public static int multiply(int i1,int i2)

}

首先**定義了乙個委託mathop,其簽名匹配與兩個函式add()和multiply()的簽名(也就是其帶的引數型別數量相同):

delegate int mathop(int i1,int i2);

main()中**首先使用新的委託型別宣告乙個變數,並且初始化委託變數.注意,宣告時的引數只要使用委託傳遞的函式的函式名,而不加括號:

mathop op1=new mathop(add);

(或為mathop op1=new mathop(multiply);)

委託傳遞的函式的函式體:

public static int add(int i1,int i2) 

public static int multiply(int i1,int i2)

然後把委託變數看作是乙個函式名,將引數傳遞給函式。 console.writeline(op1(100,200));

console.writeline(op2(100,200));

2.事件的實現過程

using system; 

class class1

static void student_registerok() }

class student

}

在student類中,先宣告了委託delegateregisterokevent(),然後使用event和要使用的委託型別(前面定義的delegateregisterokevent委託型別)宣告事件registerok(可以看作是委託的乙個例項。):

public delegate void delegateregisterokevent(); 

public event delegateregisterokevent registerok;

然後在main()函式中,例項化student類,然後s1.registerok事件委託給了student_registerok 方法。通過「+=」(加等於)操作符非常容易地為.net物件中的乙個事件新增乙個甚至多個響應方法;還可以通過非常簡單的「-=」(減等於)操作符取消這些響應方法。

然後,當呼叫s1.register()時,事件s1.registerok發生。

using system;

class class1

static void student_registerok()

}class student

}

在student類中,先宣告了委託delegateregisterokevent(),然後使用event和要使用的委託型別(前面定義的delegateregisterokevent委託型別)宣告事件registerok(可以看作是委託的乙個例項。):

public delegate void delegateregisterokevent();

public event delegateregisterokevent registerok;

然後在main()函式中,例項化student類,然後s1.registerok事件委託給了student_registerok 方法。通過「+=」(加等於)操作符非常容易地為.net物件中的乙個事件新增乙個甚至多個響應方法;還可以通過非常簡單的「-=」(減等於)操作符取消這些響應方法。

然後,當呼叫s1.register()時,事件s1.registerok發生。

3.c#中預定義事件處理方式

學習事件,我覺得最不好理解的就是c#中預定義了事件,使我才開始學習事件時一頭霧水。在查了些資料後,終於弄明白了一些,如下:

eventargs是包含事件資料的類的基類,用於傳遞事件的細節。

eventhandler是乙個委託宣告如下(其在.net類庫中如下宣告的)

public delegate void eventhandler( object sender , eventargs e ) 所以,所有形如:

void 函婁名(object 引數名,eventargs 引數名);

的函式都可以作為control類的click事件響應方法了。如下面所定義的乙個事件響應方法:

private void button1_click(object sender, system.eventargs e)

引數object sender表示引發事件的物件,(其實這裡傳遞的是物件的引用,如果是button1的click事件則sender就是button1)system.eventargs e 代表事件的相應資訊,如滑鼠的x,y值等。

下面我們研究一下button類看看其中的事件宣告,以click事件為例。

public event eventhandler click;

這裡定義了乙個eventhandler型別的事件click

private void button1_click(object sender, system.eventargs e)

這是我們和button1_click事件所對應的方法。注意方法的引數符合委託中的簽名(既引數列表)。那我們怎麼把這個方法和事件聯絡起來呢,請看下面的**。

this.button1.click += new system.eventhandler(this.button1_click); (其實button1.click 為system.eventhandler委派的例項事件。與委派中委派例項委託給某一方法非常相似)

把this.button1_click方法繫結到this.button1.click事件。

4.事件的引數的使用。

using system; 

class class1

static void student_registerok(registerokargs e) }

class student }

class registerokargs:eventargs

}

vtk事件響應機制

vtk中大致有三種時間響應機制 command observer模式之callback function vtk中的command observer模式是最常用的,也是各種處理方式的基礎。這裡首先介紹如何使用callback function的方法 void keypresscallbackfunc...

c 事件機制

c 事件機制比mfc 理解起來更為容易。記錄如下。理解c 的事件機制,需要理解事件的三方,事件產生方,事件接收方,和事件本身的資料。下面直接參照網上的乙個例子來說明這三方。假設乙個溫度監測器,監測加熱爐的溫度,當溫度到達100度的時候報警。在這個例子中,事件本身是監測溫度,事件發生方是加熱爐,事件接...

C 事件機制

在所有關於c 事件機制的介紹中,我更傾向於發布者 訂閱者 publisher subscriber 這種描述。理解事件機制並不是一件容易的事情,它所涉及的思想值得我們好好去研究。本文資源來自 c 與.net技術平台實戰演練 中國青年出版社 談到事件,我們涉及到兩個角色 事件發布者 publisher...