日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

从拳皇97中浅谈C#委托与事件

發(fā)布時(shí)間:2024/1/1 C# 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从拳皇97中浅谈C#委托与事件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先看看下列代碼:

protected void Page_Load(object sender, EventArgs e)
{

}

protected void btnSearch_Click(object sender, ImageClickEventArgs e)
{

}

是不是很眼熟呢?其中的參數(shù)(sender,e)到底是代表的是什么呢?這就要涉及到C#的委托與事件。

?

那我們首先來看一下比較正統(tǒng)的感念吧:

?

事件是類在發(fā)生其關(guān)注的事情時(shí)用來提供通知的一種方式。

?

事件的發(fā)生一般都牽扯2個(gè)角色

?

事件發(fā)行者(Publisher):一個(gè)事件的發(fā)行者,也稱作是發(fā)送者(參數(shù):sender),其實(shí)就是個(gè)對(duì)象,這個(gè)對(duì)象會(huì)自行維護(hù)本身的狀態(tài)信息(參數(shù):e),當(dāng)本身狀態(tài)信息變動(dòng)時(shí),便觸發(fā)一個(gè)事件,并通知說有的事件訂閱者。

?

事件訂閱者(Subscriber):對(duì)事件感興趣的對(duì)象,也稱為Receiver,可以注冊(cè)感興趣的事件,在事件發(fā)行者觸發(fā)一個(gè)事件后,會(huì)自動(dòng)執(zhí)行這段代碼。

?

委托就好比:現(xiàn)實(shí)生活中的中介機(jī)構(gòu),比如我們通過租房的中介,我們把租房的需求告訴給他們,然后他們?nèi)臀覀內(nèi)フ易∷N覀冎恍枰P(guān)心自己的能夠承擔(dān)多少的價(jià)格或者環(huán)境什么之類的,并不參與找房子這個(gè)過程.

事件就好比:很多人都去找租房的中介去租房子,根據(jù)不同的需求找到了不同的住所,然后同時(shí)通知所有的人,讓他們?nèi)タ捶孔印1热缯f 張三 李四 王二麻子,他們?nèi)值?#xff0c;其中 張三和李四對(duì)住房的條件不是很挑剔,王二麻子就很日怪,他就喜歡潮濕一點(diǎn)的房子, 然后他們一起找到了中介公司(發(fā)送委托),中介公司了解到了他們的需求,全部都記錄在自己的筆記本上(添加事件),以便對(duì)自己的房源進(jìn)行篩選(過濾),最后中介公司分別通知他們?nèi)タ捶孔?#xff08;執(zhí)行事件)。

所以從本質(zhì)上來說 :??事件 等價(jià)于 委托鏈

? 比如拳皇97中,當(dāng)我們?cè)诳刂埔粋€(gè)角色的時(shí)候,輸入不同的有效鍵位,會(huì)出來不同的動(dòng)作。每一個(gè)角色都有自己的技能(類似上面的租房需求),但是什么時(shí)候觸發(fā)這個(gè)技能(交給委托,角色自己不關(guān)心),就是在我們正確的按鍵了過后,才能夠執(zhí)行(完成委托).

下面從一個(gè)簡(jiǎn)單的demo中來理解這個(gè)概念:(有兩個(gè)角色 :八神庵,草稚京)

?先定義一個(gè)類SkillEventArgs ,用來保存用戶輸入的狀態(tài)信息。

///所有訂閱者【Subscriber】,也就是e,都要繼承微軟的EventArgs(這是一種。net的規(guī)范) //本例中訂閱者【也稱觀察者】八神庵,草稚京 他們感興趣的e對(duì)象,就是【action】 ,也就是我們輸入的鍵位保存在這里class SkillEventArgs : EventArgs{public string Action { get; set; }public SkillEventArgs(string action){this.Action = action;}}

?

?接著定義一個(gè)類Publish,作為中介機(jī)構(gòu).

// 發(fā)布者【Publisher】class Publisher{public delegate void InputKeyboardEventHandler(object sender, SkillEventArgs e); // 定義委托,只處理 觀察者感興趣的e對(duì)象,所以作為參數(shù)傳入. sender 也就是監(jiān)視對(duì)象,本例中就是Publisherpublic event InputKeyboardEventHandler InputKeyboardEvent; // 定義事件,保存所有的委托鏈.protected virtual void OnInputKeyboard(SkillEventArgs e) // 事件只能在方法里觸發(fā),這里是觸發(fā)對(duì)應(yīng)角色的技能輸出。 {if (InputKeyboardEvent != null){//Sender = this,也就是PublisherInputKeyboardEvent(this,e); } //InputKeyboardEvent?.Invoke(this, e); 等價(jià)于 上面的代碼 }public void UseSkill(string skill) // 實(shí)列對(duì)外的函數(shù)調(diào)用。 {SkillEventArgs skills = new SkillEventArgs(skill);OnInputKeyboard(skills);}}

?

?定義一個(gè)抽象類 Person類: 其中有一個(gè)字典類型的Skills屬性,保存的是觸發(fā)的組合鍵,以及對(duì)應(yīng)的技能名稱. 還有一個(gè)是 UseSkill的抽象方法. 以及繼承Person類的 八神類 和 草稚京類

abstract class Person{public static Dictionary<string, string> Skills { get; set; }public abstract void UseSkill(object sender, SkillEventArgs e);}class Iori : Person{static Iori(){Skills = new Dictionary<string, string>();Skills.Add("k", "百式·鬼燃燒");}public override void UseSkill(object sender, SkillEventArgs e){if (Skills.ContainsKey(e.Action)){Console.WriteLine(Skills[e.Action]);}else{Console.WriteLine("我 八神庵 沒有此技能!!");}}}class Kyo : Person{static Kyo(){Skills = new Dictionary<string, string>();Skills.Add("k", "里百八式·大蛇雉");}public override void UseSkill(object sender, SkillEventArgs e){if (Skills.ContainsKey(e.Action)){Console.WriteLine(Skills[e.Action]);}else{Console.WriteLine("我 草稚京 沒有此技能!!");}}}

最后在Main函數(shù)上輸出:

static void Main(string[] args){while (true){Console.WriteLine("選擇你要控制的角色:");Console.WriteLine("a:八神庵");Console.WriteLine("b:草稚京");string role = Console.ReadLine();if (role == "a") { Console.WriteLine("正在使用八神庵"); }else if (role == "b") { Console.WriteLine("正在使用草稚京"); }else { Console.WriteLine("沒有此角色"); continue; };while (true){Console.WriteLine("請(qǐng)出招:");string skill = Console.ReadLine();Publisher p = new Publisher();if (role == "a"){p.InputKeyboardEvent += new Iori().UseSkill; //綁定事件 }else{p.InputKeyboardEvent += new Kyo().UseSkill;}p.UseSkill(skill);}}}

?效果:

?

?

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/yezhizhen/p/8467103.html

總結(jié)

以上是生活随笔為你收集整理的从拳皇97中浅谈C#委托与事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。