偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 后端
為什么會(huì)有委托?委托有什么好處?本文就解答了學(xué)習(xí)C#委托和事件過(guò)程中的一些問(wèn)題。

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

網(wǎng)上也有不少此類(lèi)的文章,最具代表性的是張子陽(yáng)的C#中的委托和事件以及C#中的委托和事件(續(xù))這兩篇,寫(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ě)此類(lèi)文章!

為什么會(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類(lèi)從MulticastDelegate(多路廣播委托)繼承而來(lái),所以可以將多個(gè)委托賦給同一個(gè)事件!

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

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         XiaoBai xiaobai = new XiaoBai();  
  6.         //Google公司  
  7.         ItCompany google = new ItCompany("谷歌中國(guó)""CTO", xiaobai);  
  8.         //微軟公司  
  9.         ItCompany microsoft = new ItCompany("微軟中國(guó)""架構(gòu)師", xiaobai);  
  10.  
  11.         //花旗銀行  
  12.         FinanceCompany AmericaBank = new FinanceCompany("花旗銀行""金融分析師", xiaobai);  
  13.  
  14.         //委托的好處,可以應(yīng)用于不同的類(lèi)的不同方法  
  15.         //方法“委托”給委托,委托“委托”給事件  
  16.         //委托類(lèi)型與事件聲明時(shí)的委托類(lèi)型相同  
  17.         //因?yàn)槭莻饕茫苑椒ê竺娌荒軒Юㄌ?hào),帶括號(hào)則是調(diào)用方法了  
  18.         //一個(gè)委托可以搭載多個(gè)方法,一個(gè)事件則擁有一個(gè)委托鏈  
  19.         xiaobai.Update += new TheEventHandler(google.ComeToItCompany);  
  20.         xiaobai.Update += new TheEventHandler(microsoft.ComeToItCompany);  
  21.         xiaobai.Update += new TheEventHandler(AmericaBank.ComeToFinanceCompany);  
  22.  
  23.         xiaobai.SubjectState = "我小白過(guò)來(lái)應(yīng)聘職位啦!";  
  24.  
  25.         //發(fā)出通知,觸發(fā)事件  
  26.         xiaobai.Notify();  
  27.  
  28.         //以下代碼與上面相似  
  29.         XiaoHua xiaohua = new XiaoHua();  
  30.  
  31.         ItCompany microsoft2 = new ItCompany("微軟總公司""CEO", xiaohua);  
  32.  
  33.         FinanceCompany ChinaBank = new FinanceCompany("中國(guó)央行""財(cái)務(wù)部總經(jīng)理", xiaohua);  
  34.  
  35.         xiaohua.Update += new TheEventHandler(microsoft2.ComeToItCompany);  
  36.         xiaohua.Update += new TheEventHandler(ChinaBank.ComeToFinanceCompany);  
  37.  
  38.         xiaohua.SubjectState = "我小華過(guò)來(lái)應(yīng)聘職位啦!";  
  39.  
  40.         xiaohua.Notify();  
  41.  
  42.         Console.ReadLine();  
  43.     }  
  44. }  
  45.  
  46. //通知者接口  
  47. interface Subject  
  48. {  
  49.     void Notify();  
  50.  
  51.     string SubjectState  
  52.     {  
  53.         get;  
  54.         set;  
  55.     }  
  56. }  
  57.  
  58. //事件處理程序的委托,相當(dāng)于一個(gè)類(lèi)(在編譯成IL后確確實(shí)實(shí)是類(lèi))或者方法指針,與常規(guī)類(lèi)定義不同,帶參數(shù)和返回值  
  59. delegate void TheEventHandler();  
  60.  
  61. //小白  
  62. class XiaoBai : Subject  
  63. {  
  64.     //聲明一事件Update,類(lèi)型為委托TheEventHandler  
  65.     public event TheEventHandler Update;  
  66.  
  67.     private string action;  
  68.  
  69.     //用Notify方法觸發(fā)事件  
  70.     public void Notify()  
  71.     {  
  72.         Update();  
  73.     }  
  74.  
  75.     public string SubjectState  
  76.     {  
  77.         get { return action; }  
  78.         set { action = value; }  
  79.     }  
  80. }  
  81.  
  82. //小華  
  83. class XiaoHua : Subject  
  84. {  
  85.     //聲明一事件Update,類(lèi)型為委托TheEventHandler  
  86.     public event TheEventHandler Update;  
  87.  
  88.     private string action;  
  89.  
  90.     //用Notify方法觸發(fā)事件  
  91.     public void Notify()  
  92.     {  
  93.         Update();  
  94.     }  
  95.  
  96.     public string SubjectState  
  97.     {  
  98.         get { return action; }  
  99.         set { action = value; }  
  100.     }  
  101. }  
  102.  
  103. //IT行業(yè)  
  104. class ItCompany  
  105. {  
  106.     private string companyname;  
  107.     private string job;  
  108.     private Subject sub;  
  109.  
  110.     public ItCompany(string _companyname, string _job, Subject _sub)  
  111.     {  
  112.         companyname = _companyname;  
  113.         job = _job;  
  114.         sub = _sub;  
  115.     }  
  116.  
  117.     //參數(shù)和返回值與委托TheEventHandler一致  
  118.     public void ComeToItCompany()  
  119.     {  
  120.         Console.WriteLine("{0} {1}: 來(lái)我們公司做{2}!", sub.SubjectState, companyname, job);  
  121.     }  
  122. }  
  123.  
  124. //金融行業(yè)  
  125. class FinanceCompany  
  126. {   
  127.     private string companyname;  
  128.     private string job;  
  129.     private Subject sub;  
  130.  
  131.     public FinanceCompany(string _companyname, string _job, Subject _sub)  
  132.     {  
  133.         companyname = _companyname;  
  134.         job = _job;  
  135.         sub = _sub;  
  136.     }  
  137.  
  138.     //參數(shù)和返回值與委托TheEventHandler一致  
  139.     public void ComeToFinanceCompany()  
  140.     {  
  141.         Console.WriteLine("{0} {1}: 來(lái)我們公司做{2}!", sub.SubjectState, companyname, job);  
  142.     }  

通過(guò)以上總結(jié),我相信大家對(duì)C#委托和事件應(yīng)該可以更好地理解了!當(dāng)然,委托的知識(shí)不止這些,還會(huì)用到檢查空值、異常處理和多線程處理等等,這篇文章僅在解惑(我也不高興浪費(fèi)太多的時(shí)間來(lái)具體講解)!如果你想更好地掌握委托和事件,可以看下上面提到的張子陽(yáng)的兩篇文章或者買(mǎi)本《C#本質(zhì)論》仔細(xì)研讀;如果你想了解觀察者模式,可以看下上面提到的TerryLee那篇文章;如果你還沒(méi)有學(xué)習(xí)設(shè)計(jì)模式或者剛剛開(kāi)始學(xué)習(xí),我建議閱讀《大話設(shè)計(jì)模式》;如果你學(xué)習(xí)設(shè)計(jì)模式有一段時(shí)間了,我建議閱讀《設(shè)計(jì)模式:基于C#的工程化實(shí)現(xiàn)及擴(kuò)展》!祝各位程序員好運(yùn)!

【編輯推薦】

  1. 總結(jié)C#語(yǔ)言命名規(guī)范
  2. C#反射相關(guān)知識(shí)學(xué)習(xí)
  3. 大話F#和C#:是否會(huì)重蹈C#失敗的覆轍?
  4. 總結(jié)和學(xué)習(xí)C#接口
  5. 學(xué)習(xí)C#程序有感
責(zé)任編輯:book05 來(lái)源: hi.baidu
相關(guān)推薦

2009-08-27 16:53:01

C#委托C#事件

2009-08-18 10:54:17

C#事件和委托

2009-10-09 09:07:40

C#委托和事件

2024-05-16 13:36:04

C#委托事件

2024-06-28 10:19:02

委托事件C#

2009-09-08 15:28:24

C#委托

2009-08-03 13:23:04

C#編程組件-事件-委托

2024-05-15 09:11:51

委托事件C#

2009-08-04 13:53:58

C#委托類(lèi)C#事件

2009-07-20 10:36:29

什么是JDBC

2011-06-30 10:28:50

C#開(kāi)發(fā)

2013-03-19 09:48:38

C#

2024-10-05 00:00:35

Action?C#Func?

2024-05-30 12:24:03

C#開(kāi)發(fā)

2009-08-26 14:48:05

C#委托與事件

2009-08-18 10:35:26

C#委托

2024-09-29 09:28:38

Action?C#

2009-08-20 18:11:08

C#異步委托

2011-04-22 09:14:26

C#委托

2024-12-23 08:00:00

委托C#編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)