中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#委托和事件

發布時間:2020-10-01 10:25:41 來源:網絡 閱讀:321 作者:utalents 欄目:編程語言

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

網上也有不少此類的文章,最具代表性的是張子陽的C#中的委托和事件以及C#中的委托和事件(續)這兩篇,寫得的確很好,得到很多讀者的贊賞,但我看評論,還是發現了些問題,因為有不少讀者是看了一遍又一遍,每次感覺都蠻好,可是隔一段時間,對“委托和事件”又迷糊了,于是又來看!我真搞不懂,為什么會出現這種情況!后來想想,文章雖好,但總結的地方沒有把重點列出來;再者,讀者跟著作者的思路,的確能把文章看懂,但是讀者自己不得要領,沒有真正弄明白,因此就出現了上面提到的狀況!

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

為什么會有委托?

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

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

當然,我們都是在某個方法中觸發事件,事件將其交給委托,委托再交給方法,方法再進行實際的操作,與上面的步驟剛好相反!其實觸發事件的目的就是觸發具體方法!

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

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

  1. class Program  

  2. {  

  3.    static void Main(string[] args)  

  4.    {  

  5.        XiaoBai xiaobai = new XiaoBai();  

  6.        //Google公司  

  7.        ItCompany google = new ItCompany("谷歌中國", "CTO", xiaobai);  

  8.        //微軟公司  

  9.        ItCompany microsoft = new ItCompany("微軟中國", "架構師", xiaobai);  


  10.        //花旗銀行  

  11.        FinanceCompany AmericaBank = new FinanceCompany("花旗銀行", "金融分析師", xiaobai);  


  12.        //委托的好處,可以應用于不同的類的不同方法  

  13.        //方法“委托”給委托,委托“委托”給事件  

  14.        //委托類型與事件聲明時的委托類型相同  

  15.        //因為是傳引用,所以方法后面不能帶括號,帶括號則是調用方法了  

  16.        //一個委托可以搭載多個方法,一個事件則擁有一個委托鏈  

  17.        xiaobai.Update += new TheEventHandler(google.ComeToItCompany);  

  18.        xiaobai.Update += new TheEventHandler(microsoft.ComeToItCompany);  

  19.        xiaobai.Update += new TheEventHandler(AmericaBank.ComeToFinanceCompany);  


  20.        xiaobai.SubjectState = "我小白過來應聘職位啦!";  


  21.        //發出通知,觸發事件  

  22.        xiaobai.Notify();  


  23.        //以下代碼與上面相似  

  24.        XiaoHua xiaohua = new XiaoHua();  


  25.        ItCompany microsoft2 = new ItCompany("微軟總公司", "CEO", xiaohua);  


  26.        FinanceCompany ChinaBank = new FinanceCompany("中國央行", "財務部總經理", xiaohua);  


  27.        xiaohua.Update += new TheEventHandler(microsoft2.ComeToItCompany);  

  28.        xiaohua.Update += new TheEventHandler(ChinaBank.ComeToFinanceCompany);  


  29.        xiaohua.SubjectState = "我小華過來應聘職位啦!";  


  30.        xiaohua.Notify();  


  31.        Console.ReadLine();  

  32.    }  

  33. }  


  34. //通知者接口  

  35. interface Subject  

  36. {  

  37.    void Notify();  


  38.    string SubjectState  

  39.    {  

  40.        get;  

  41.        set;  

  42.    }  

  43. }  


  44. //事件處理程序的委托,相當于一個類(在編譯成IL后確確實實是類)或者方法指針,與常規類定義不同,帶參數和返回值  

  45. delegate void TheEventHandler();  


  46. //小白  

  47. class XiaoBai : Subject  

  48. {  

  49.    //聲明一事件Update,類型為委托TheEventHandler  

  50.    public event TheEventHandler Update;  


  51.    private string action;  


  52.    //用Notify方法觸發事件  

  53.    public void Notify()  

  54.    {  

  55.        Update();  

  56.    }  


  57.    public string SubjectState  

  58.    {  

  59.        get { return action; }  

  60.        set { action = value; }  

  61.    }  

  62. }  


  63. //小華  

  64. class XiaoHua : Subject  

  65. {  

  66.    //聲明一事件Update,類型為委托TheEventHandler  

  67.    public event TheEventHandler Update;  


  68.    private string action;  


  69.    //用Notify方法觸發事件  

  70.    public void Notify()  

  71.    {  

  72.        Update();  

  73.    }  


  74.    public string SubjectState  

  75.    {  

  76.        get { return action; }  

  77.        set { action = value; }  

  78.    }  

  79. }  


  80. //IT行業  

  81. class ItCompany  

  82. {  

  83.    private string companyname;  

  84.    private string job;  

  85.    private Subject sub;  


  86.    public ItCompany(string _companyname, string _job, Subject _sub)  

  87.    {  

  88.        companyname = _companyname;  

  89.        job = _job;  

  90.        sub = _sub;  

  91.    }  


  92.    //參數和返回值與委托TheEventHandler一致  

  93.    public void ComeToItCompany()  

  94.    {  

  95.        Console.WriteLine("{0} {1}: 來我們公司做{2}!", sub.SubjectState, companyname, job);  

  96.    }  

  97. }  


  98. //金融行業  

  99. class FinanceCompany  

  100. {  

  101.    private string companyname;  

  102.    private string job;  

  103.    private Subject sub;  


  104.    public FinanceCompany(string _companyname, string _job, Subject _sub)  

  105.    {  

  106.        companyname = _companyname;  

  107.        job = _job;  

  108.        sub = _sub;  

  109.    }  


  110.    //參數和返回值與委托TheEventHandler一致  

  111.    public void ComeToFinanceCompany()  

  112.    {  

  113.        Console.WriteLine("{0} {1}: 來我們公司做{2}!", sub.SubjectState, companyname, job);  

  114.    }  

  115. }

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

From

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石楼县| 木里| 喀喇沁旗| 芦山县| 华容县| 霍林郭勒市| 紫阳县| 凭祥市| 长宁区| 黄浦区| 余庆县| 道真| 韩城市| 东乌珠穆沁旗| 繁峙县| 涞水县| 溧水县| 定陶县| 石渠县| 且末县| 黎川县| 罗山县| 名山县| 甘谷县| 馆陶县| 洮南市| 图片| 阜平县| 南木林县| 临猗县| 富宁县| 宿迁市| 扶余县| 贺兰县| 仙桃市| 无锡市| 镇沅| 靖安县| 平乡县| 盈江县| 孝昌县|