天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

解惑答疑:C#委托和事件

  相信很多人一直為C#委托和事件所困惑,尤其是C#的初學(xué)者,學(xué)到這一部分會(huì)感覺(jué)比較困難,很有可能就放棄了,而且.NET對(duì)委托和事件封裝得挺好,一般都不怎么用到自定義的委托和事件,所以放棄學(xué)習(xí)該技術(shù)就有了借口!

  網(wǎng)上也有不少此類的文章,最具代表性的是張子陽(yáng)的C#中的委托和事件這篇,寫(xiě)得的確很好,得到很多讀者的贊賞,但我看評(píng)論,還是發(fā)現(xiàn)了些問(wèn)題,因?yàn)橛胁簧僮x者是看了一遍又一遍,每次感覺(jué)都蠻好,可是隔一段時(shí)間,對(duì)“委托和事件”又迷糊了,于是又來(lái)看!我真搞不懂,為什么會(huì)出現(xiàn)這種情況!后來(lái)想想,文章雖好,但總結(jié)的地方?jīng)]有把重點(diǎn)列出來(lái);再者,讀者跟著作者的思路,的確能把文章看懂,但是讀者自己不得要領(lǐng),沒(méi)有真正弄明白,因此就出現(xiàn)了上面提到的狀況!

  C#委托和事件真的難嗎,其實(shí)不然。要搞懂它,第一,要看你的理解能力;第二,要看你怎么理解它。如果你覺(jué)得理解起來(lái)比較困難,那我們可以換種理解方式,也許能很好地理解它了!其實(shí)委托和事件的確不難,大牛級(jí)別的甚至都不屑寫(xiě)此類文章!

  為什么會(huì)有委托?

  委托其實(shí)就是個(gè)方法指針,擁有同樣參數(shù)和返回值的任何方法都能傳給委托;委托能夠消除條件分支語(yǔ)句,不需要根據(jù)if、case這些語(yǔ)句來(lái)判斷具體調(diào)用哪個(gè)方法!而委托又是從觀察者模式演化而來(lái),這里推薦閱讀TerryLee的這篇觀察者模式文章。  

  前面說(shuō)的的就算不理解也不要緊,關(guān)鍵是理解方法、委托、事件之間的關(guān)系。可以這樣說(shuō),方法是“委托”給委托的,而委托是“委托”給事件的。可以將事件看成是委托的一個(gè)容器,里面可以加一連串的委托!這樣來(lái)理解,那所有的事情就都解決了!

  當(dāng)然,我們都是在某個(gè)方法中觸發(fā)事件,事件將其交給委托,委托再交給方法,方法再進(jìn)行實(shí)際的操作,與上面的步驟剛好相反!其實(shí)觸發(fā)事件的目的就是觸發(fā)具體方法!

  再來(lái)說(shuō)說(shuō)委托的好處(上面沒(méi)舉例子),比如你開(kāi)發(fā)了一個(gè)電子商務(wù)平臺(tái),后臺(tái)有管理商品的功能,而商品信息有七八列或者更多,包括編號(hào)、商品名稱、價(jià)格、上架時(shí)間等等,該信息又能根據(jù)任意一列來(lái)進(jìn)行排序!如果沒(méi)有委托,我們將根據(jù)點(diǎn)擊某列所產(chǎn)生的信息,將這信息傳給某個(gè)排序方法,而這個(gè)排序方法會(huì)接受傳來(lái)的信息作為參數(shù),再根據(jù)內(nèi)部的分支語(yǔ)句if、case等來(lái)判斷具體采用哪個(gè)排序方法,這樣的話,邏輯變復(fù)雜,這過(guò)程當(dāng)中還要做很多無(wú)用功(因?yàn)楹苡锌赡芤M(jìn)行多次判斷才能找到要真正執(zhí)行的方法),而且如果我們將來(lái)再增加列,又得增加分支語(yǔ)句,違背了“開(kāi)放—封閉”原則,維護(hù)起來(lái)比較麻煩!有了委托,我們不需要傳遞任何參數(shù),直接將具體方法傳給委托即可,增加列則只要增加一個(gè)新方法,爽!我們完全可以通過(guò)委托來(lái)調(diào)用方法,那為什么還要事件呢?事件其實(shí)是對(duì)委托進(jìn)行一種限制,使其無(wú)法使用“=”賦值運(yùn)算符(如果使用則在編譯時(shí)產(chǎn)生錯(cuò)誤),只能使用“+=”或者“-=”運(yùn)算符,這就防止了程序員誤將原先的委托鏈給覆蓋掉,另外delegate類從MulticastDelegate(多路廣播委托)繼承而來(lái),所以可以將多個(gè)委托賦給同一個(gè)事件!

  最后,列一串代碼把上面的概念理清一下

class Program
{
static void Main(string[] args)
{
 XiaoBai xiaobai
= new XiaoBai();
//Google公司
ItCompany google = new ItCompany("谷歌中國(guó)", "CTO", xiaobai);
//微軟公司
ItCompany microsoft = new ItCompany("微軟中國(guó)", "架構(gòu)師", xiaobai);
//花旗銀行
FinanceCompany AmericaBank = new FinanceCompany("花旗銀行", "金融分析師", xiaobai);
//委托的好處,可以應(yīng)用于不同的類的不同方法
//方法“委托”給委托,委托“委托”給事件
//委托類型與事件聲明時(shí)的委托類型相同
//因?yàn)槭莻饕茫苑椒ê竺娌荒軒Юㄌ?hào),帶括號(hào)則是調(diào)用方法了
//一個(gè)委托可以搭載多個(gè)方法,一個(gè)事件則擁有一個(gè)委托鏈
xiaobai.Update += new TheEventHandler(google.ComeToItCompany);
xiaobai.Update
+= new TheEventHandler(microsoft.ComeToItCompany);
xiaobai.Update
+= new TheEventHandler(AmericaBank.ComeToFinanceCompany);
xiaobai.SubjectState
= "我小白過(guò)來(lái)應(yīng)聘職位啦!";
//發(fā)出通知,觸發(fā)事件
xiaobai.Notify();
//以下代碼與上面相似
XiaoHua xiaohua = new XiaoHua();
ItCompany microsoft2
= new ItCompany("微軟總公司", "CEO", xiaohua);
FinanceCompany ChinaBank
= new FinanceCompany("中國(guó)央行", "財(cái)務(wù)部總經(jīng)理", xiaohua);
xiaohua.Update
+= new TheEventHandler(microsoft2.ComeToItCompany);
xiaohua.Update
+= new TheEventHandler(ChinaBank.ComeToFinanceCompany);
xiaohua.SubjectState
= "我小華過(guò)來(lái)應(yīng)聘職位啦!";
xiaohua.Notify()
Console.ReadLine();
}
}
//通知者接口
interface Subject
{
void Notify();

string SubjectState
{
get;
set;
}
}
 
//事件處理程序的委托,相當(dāng)于一個(gè)類(在編譯成IL后確確實(shí)實(shí)是類)或者方法指針,
與常規(guī)類定義不同,帶參數(shù)和返回值

delegate void TheEventHandler();
//小白
class XiaoBai : Subject
{
//聲明一事件Update,類型為委托TheEventHandler
public event TheEventHandler Update;
private string action; //用Notify方法觸發(fā)事件
public void Notify()
{
Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
//小華
class XiaoHua : Subject
{
//聲明一事件Update,類型為委托TheEventHandler
public event TheEventHandler Update;
private string action;
//用Notify方法觸發(fā)事件
public void Notify()
{
Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
//IT行業(yè)
class ItCompany
{
private string companyname;
private string job;
private Subject sub;

public ItCompany(string _companyname, string _job, Subject _sub)
{
companyname
= _companyname;
job
= _job;
sub
= _sub;
}
//參數(shù)和返回值與委托TheEventHandler一致
public void ComeToItCompany()
{
Console.WriteLine(
"{0} {1}: 來(lái)我們公司做{2}!", sub.SubjectState,
companyname, job);
}
}
//金融行業(yè)
class FinanceCompany
{
private string companyname;
private string job;
private Subject sub;

public FinanceCompany(string _companyname, string _job, Subject _sub)
{
companyname
= _companyname;
job
= _job;
sub
= _sub;
}
//參數(shù)和返回值與委托TheEventHandler一致
public void ComeToFinanceCompany()
{
Console.WriteLine(
"{0} {1}: 來(lái)我們公司做{2}!", sub.SubjectState,
companyname, job);
}
}

NET技術(shù)解惑答疑:C#委托和事件,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久大综合 | 天天操夜夜噜 | 日日噜噜噜夜夜爽爽狠狠图片 | 伊人久久大香线蕉综合亚洲 | 久久精品亚洲热综合一本 | 亚洲免费在线视频观看 | 一区二区三区国产 | 优优色影院| 久久精品99热超碰 | 扒开女人下面使劲桶动态图 | 国产成人欧美日韩在线电影 | 国产一区精选播放022 | 日本综艺大尺度无删减版在线 | 午夜色网站 | 99久久国产综合精品网成人影院 | 午夜免费国产体验区免费的 | 亚洲国产综合另类视频 | 24小时日本在线 | 奇米色偷偷 | 人人草影院 | 国产亚洲福利精品一区 | 亚洲精品视频免费在线观看 | 亚洲AV无码乱码国产麻豆穿越 | 日本精品卡一卡2卡3卡四卡三卡 | 亚洲视频国产在线精品 | 精品一区二区三区AV天堂 | 久草免费视频在线观看 | 色综合伊人色综合网站中国 | 259luxu高跟黑色丝袜系列 | YELLOW日本动漫免费动漫 | 成人毛片18岁女人毛片免费看 | 亚洲免费无l码中文在线视频 | 撕开美女的衣服2 | 国产亚洲日韩另类在线播放 | 日韩欧美中文字幕在线二视频 | 欧美夜夜噜2017最新 | 97人摸人人澡人人人超一碰 | 日本特殊精油按摩 | 99久久无码一区人妻A片蜜 | 日美一级毛片 | 亚洲成人免费在线 |