委托、Lambda表达式、事件系列07,使用EventHandler委托
談到事件注冊(cè),EventHandler是最常用的。
EventHandler是一個(gè)委托,接收2個(gè)形參。sender是指事件的發(fā)起者,e代表事件參數(shù)。
?
□ 使用EventHandler實(shí)現(xiàn)猜拳游戲
?
使用EventHandler實(shí)現(xiàn)一個(gè)猜拳游戲,每次出拳,出剪刀、石頭、布這三者的其中一種。
?
首先抽象出一個(gè)被觀察者,其中提供了事件,提供了執(zhí)行事件的方法。
public class FistGame { public string FistName { get; set; } public event EventHandler GuessFist; public void Start() { if (GuessFist != null) { GuessFist(this, EventArgs.Empty); } } }
以上,在Start方法內(nèi)部調(diào)用事件GuessFist的時(shí)候,實(shí)參this代表FistGame類本身。??
客戶端必須有一個(gè)方法和EventHandler的定義保持一致,這樣才可以注冊(cè)到FistGame類的EventHandler事件上。
class Program { static void Main(string[] args) { FistGame jiandao = new FistGame(){FistName = "剪刀"}; jiandao.GuessFist += GetFistResult; FistGame shitou = new FistGame() { FistName = "石頭" }; shitou.GuessFist += GetFistResult; FistGame bu = new FistGame() { FistName = "布" }; bu.GuessFist += GetFistResult; FistGame finalFist = null; var temp = new Random().Next()%3; if (temp == 0) { finalFist = jiandao; } else if(temp == 1) { finalFist = shitou; } else { finalFist = bu; } finalFist.Start(); } static void GetFistResult(object sender, EventArgs e) { FistGame fistGame = sender as FistGame; Console.WriteLine("本次出的拳為:" + fistGame.FistName); } }??
以上,GetFistResult方法的參數(shù)列表符合EventHandler的定義,并且給每個(gè)FistGame實(shí)例的GuessFist事件注冊(cè)了該方法。最后,根據(jù)隨機(jī)數(shù)來(lái)決定采用哪個(gè)FistGame實(shí)例。??
?
□ 使用EventHandler傳遞事件參數(shù)
?
首先需要一個(gè)派生于EventArgs的類,通過(guò)構(gòu)造函數(shù)注入一個(gè)枚舉狀態(tài)。
public class FistGameEventArgs : EventArgs { public FistEnum CurrentFist { get; private set; } public FistGameEventArgs(FistEnum currentFist) { CurrentFist = currentFist; } } public enum FistEnum { jiandao, shitou, bu }?
作為被觀察者的FistGame來(lái)講,現(xiàn)在需要EventHandler<TEventArgs>泛型來(lái)實(shí)現(xiàn)。
public class FistGame { public string FistName { get; set; } public event EventHandler<FistGameEventArgs> GuessFist; public void Start() { if (GuessFist != null) { GuessFist(this, new FistGameEventArgs(FistEnum.jiandao)); } } }?
客戶端,與EventHandler參數(shù)列表一致的GetFistResult方法把事件參數(shù)顯示出來(lái)。???
static void Main(string[] args) { FistGame jiandao = new FistGame(){FistName = "剪刀"}; jiandao.GuessFist += GetFistResult; jiandao.Start(); } static void GetFistResult(object sender, FistGameEventArgs e) { FistGame fistGame = sender as FistGame; Console.WriteLine("從Name屬性獲得,本次出的拳為:" + fistGame.FistName); switch (e.CurrentFist) { case FistEnum.jiandao: Console.WriteLine("從事件參數(shù)獲得,本次出的拳為:剪刀"); break; case FistEnum.shitou: Console.WriteLine("從事件參數(shù)獲得,本次出的拳為:石頭"); break; case FistEnum.bu: Console.WriteLine("從事件參數(shù)獲得,本次出的拳為:布"); break; } } }?
總結(jié):使用EventHandler委托不僅可以實(shí)現(xiàn)事件注冊(cè)和取消,而且還可以獲取事件發(fā)起者和事件參數(shù)。
?
?
“委托、Lambda表達(dá)式、事件系列”包括:
委托、Lambda表達(dá)式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target屬性
委托、Lambda表達(dá)式、事件系列02,什么時(shí)候該用委托
委托、Lambda表達(dá)式、事件系列03,從委托到Lamda表達(dá)式
委托、Lambda表達(dá)式、事件系列04,委托鏈?zhǔn)窃鯓有纬傻? 多播委托, 調(diào)用委托鏈方法,委托鏈異常處理
委托、Lambda表達(dá)式、事件系列05,Action委托與閉包
委托、Lambda表達(dá)式、事件系列06,使用Action實(shí)現(xiàn)觀察者模式,體驗(yàn)委托和事件的區(qū)別
委托、Lambda表達(dá)式、事件系列07,使用EventHandler委托
轉(zhuǎn)載于:https://www.cnblogs.com/darrenji/p/4004343.html
總結(jié)
以上是生活随笔為你收集整理的委托、Lambda表达式、事件系列07,使用EventHandler委托的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面向关系数据库的智能索引调优方法
- 下一篇: 小白学JAVA,与你们感同身受,JAVA