.net
的事件模型建立在委託機制之上,透徹的了解了委託才能明白的分析事件。可以說,事件是對委託的封裝,從委託的示例中可知,在客戶端可以隨意對委託進行操作,一定程度上破壞了面向的物件的封裝機制,因此事件實現了對委託的封裝。
下面,通過將委託的示例進行改造,來完成乙個事件的定義過程:
public class calculator
} //
宣告事件委託
public delegate void calculateeventhandler(object sender,calculateeventargs e); //
定義事件成員,提供外部繫結
public event calculateeventhandler mycalculate; //
提供受保護的虛方法,可以由子類覆寫來拒絕監視
protected virtual void oncalculate(calculateeventargs e)
} //
進行計算,呼叫該方法表示有新的計算發生
public void calculate(int32 x, int32 y)
} 示例中,對計算器模擬程式做了簡要的修改,從二者的對比中可以體會事件的完整定義過程,
主要包括:
l 定義乙個內部事件引數型別,用於存放事件引發時向事件處理程式傳遞的狀態資訊,
eventargs
是事件資料類的基類。
l 宣告事件委託,主要包括兩個引數:乙個表示事件傳送者物件,乙個表示事件引數類物件。
l 定義事件成員。
l 定義負責通知事件引發的方法,它被實現為
protected virtual
方法,目的是可以在派生類中覆寫
該方法來拒絕監視事件。
l 定義乙個觸發事件的方法,例如
calculate
被呼叫時,表示有新的計算發生。
乙個事件的完整程式就這樣定義好了。然後,還需要定義乙個事件觸發程式,用來監聽事件:
//定義事件觸發者
public class calculatormanager
public void substract(object sender, calculator.calculateeventargs e)
} 最後,實現乙個事件的處理程式:
public class test_calculator
} 如果對設計模式有所了解,上述實現過程實質是
observer
模式在委託中的應用,在
.net
中對observer
模式的應用嚴格的遵守了相關的規範。在
windows form
程式開發中,對乙個
button
的click
就對應了事件的響應,例如:
this.button1.click += new system.eventhandler(this.button1_click);
用於將button1_click
方法繫結到
button1
的click
事件上,當有按鈕被按下時,將會觸發執行
button1_click
方法:private void button1_click(object sender, eventargs e)
注: calculator.mycalculate += cm.add; //只是事件繫結,不觸發(執行)事件
protected virtual void oncalculate(calculateeventargs e) //事件的觸發方法,在各處呼叫此方法時代表觸發事件(執行已繫結的所有事件委託)
}
事件和委託示例
1 timer的elapsed事件 using system using system.collections.generic using system.linq using system.text using system.timers namespace timer的elapsed事件 e.si...
C 委託和事件的使用示例
一 委託 使用委託時要先例項化,和類一樣,使用new關鍵字產生委託的新例項,然後將乙個或者多個與委託簽名匹配的方法與委託例項關聯。隨後呼叫委託時,就會呼叫所有與委託例項關聯的方法。與委託關聯可以是任何類或者結構中的方法,可以是靜態方法,只要是可以訪問的方法都可以。1.建立乙個委託型別使用關鍵字del...
C 委託和事件的使用示例
一 委託 使用委託時要先例項化,和類一樣,使用new關鍵字產生委託的新例項,然後將乙個或者多個與委託簽名匹配的方法與委託例項關聯。隨後呼叫委託時,就會呼叫所有與委託例項關聯的方法。與委託關聯可以是任何類或者結構中的方法,可以是靜態方法,只要是可以訪問的方法都可以。1.建立乙個委託型別使用關鍵字del...