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...