委托与事件以及应用
因為最近再帶兩個實習的朋友~ 他們在理解委托這塊 不明白能用來做什么 對這塊理解的不好 更不用說委托擴展來的 拉姆達表達式 事件等了~? 但是這些很重要 在MVC? EF4.1 里 都會有很多拉姆達表達式的影子 在做組件開發 用戶控件開發? 事件的運用 一定也是少不了的?? 稍微深入點兒的說? 用于兩個對象之間的通訊 用來解耦 用委托事件 是很不錯的選擇 而設計模式里的觀察者模式 也是基于委托事件的應用? 還有做winform 開發的 里的線程 WPF SL 的異步調用等? 都是有這委托的影子的? 所以 這個還是很重要的。也是一定要掌握的~ 希望通過這篇文章 能讓大家更加了解委托以及如何運用~
一.委托以及延伸
先看下MSDN 的介紹吧~------?delegate
通俗的說 委托就是可以實現 把方法做為變量來傳遞
1.先寫個最簡單的委托的用法
靜態的和非靜態方法的
結果會輸出
您好 wlf
?Hello wlf
這是最原始的委托
2. 進化為匿名方法
聲明完委托后? 還要聲明方法 是不是很麻煩? 如果不聲明方法? 用匿名方法 可以幫我們 看 代碼減少了很多吧~
3.再進化為拉姆達表達式
上面的雖然簡單了不少 但是 還能更簡單的? 用拉姆達表達式~
看 這就是拉姆達表達式的演變 一定要會這個~? 因為在EF LINQ 等 有很多用拉姆達表達式的~
4.用Action 和Func繼續簡化
上面的代碼以及很簡單了 但是還有個很不爽的一點~? 要聲明委托! 可以不聲明么?當然可以~
先看 MSDN介紹??Action?和?Func
通俗的講 這兩個都是用來幫你聲明委托?
Action 用于幫你聲明沒用返回值的委托? ? Func則是有返回值的? 最后一個參數為返回值
看~ 以前的版本 總是要聲明一個HelloWorld 的委托? 現在只有兩行代碼就可以了? 下面順便掩飾了有返回值的 func 的例子。第一個參數 是傳遞
參數的類型 第二個是返回值的類型? ~ 這里說下 這倆函數都有16個重載~? 所以多個參數是沒問題的~
5.說說委托的好處
委托的好處 應用 文章開始已經說了很多了 這里就拿文章開頭的例子 體會下委托的好處?
當我們再多一種語言來問好時? 只需增加一種Action 即可? 而不需要改動 sayHello 方法 否則 這里將充滿了 if else 的判斷?
? 6.工作里的應用
?再 LINQ 或EF 里 都有 個很重要的? 數據刷選的功能? WHERE 它的參數就是 Func? 直接上代碼? 自己看注釋~
看 可以很輕松的實現 數據過濾~? 喜歡這種函數式風格的編程方式 我們可以點? 順便介紹工作中的 Action?
嗯 有圖有真相~? 這個ForEach 的參數 正是Action 以后遇到這幾個 新手們就不用再陌生了~
?實現把集合里 大于4的打印出來的 這個功能? 全部都是點兒出來的~?
提示:盡量不要再ForEach 里進行集合的操作 比如 移除集合里的元素等~ 否則會出來不希望出現的結果~ 出來的結果為 2 4 6
原因 反編譯 我們發現是 for? 按索引刪除
上面的話題扯遠了~ 回歸主題
二 .事件以及應用
1.先用委托來實現一個常見的工作場景(委托代替事件)
?webForm? 用戶控件 我們在實際工作中 用的都是非常多的? 說一個場景? 一個用戶控件 里面一個textbox? 一個button? 一個頁面引用了
這個用戶控件 這個頁面里有一個label 我希望 點擊 用戶控件里的 button改變? 把 textbox 里的值 綁定到 label 上? 這就是一個典型的委托事件的
應用
?1.直接上代碼? 先上用戶控件的
聲明一個委托?? 當點擊按鈕時? 調用
2.? 引用用戶控件的頁的代碼
當然 我們會了拉姆達表達式? 完全可以寫成
這里主要說的是?委托的注冊 記得要寫到? !IsPostBack 外面???
大概順序是這樣的? 先執行 用戶控件的外部變量賦值 =>? 再執行父頁面的用外部變量賦值(本例子中沒有)=> 再執行父頁面的pageload=>用戶控件的pageload?
如果不寫到?!IsPostBack 外面??? 點擊按鈕后? 先執行 用戶控件的外部變量賦值(以前被賦值的委托會又為空,所以這時需要在頁面pageload 里 重新注冊 而不能寫到!IsPostBack) 里面~
3 只用委托的缺點
功能雖然實現了? 但是我們想? 我們可以在 父頁面? 給 ?Puchange.onChangevent 賦值為null 或者篡改為別的? 而我希望我們在引用時 只能添加 或移除 這樣就更
完美了 所以 事件就出來了~
2.使用事件重新實現上面的代碼
1.用戶控件里的
2.父頁面
3.winform 或Silverlight 里盡量使用委托和事件 來通訊
這樣可以更好的降低耦合? 避免了 子窗體中出現父窗體對象? 降低耦合?
?
三.委托的其他資料
委托的逆變與協變
何時使用委托何時使用接口
正則表達式委托
異步委托編程
基于事件的異步模式概述
四.總結
文章比較入門 希望新手能對委托事件有更好的了解 平且能把委托擴展來的東西 熟練運用到工作中 來簡化代碼~ 并且能把事件熟練運用~文章的目的也達到了
from:http://www.cnblogs.com/wlflovenet/archive/2011/11/02/2230775.html?
轉載于:https://www.cnblogs.com/flysnow-z/archive/2011/11/03/2234268.html
總結
- 上一篇: 【转来警醒自己】最近的一些面试感悟
- 下一篇: 使用 WebBrowser 操作 js