一.委託以及延伸
先看下MSDN 的介紹吧~------ delegate
通俗的說 委託就是可以實現 把方法做爲變量來傳遞
1.先寫個最簡單的委託的用法
靜態的和非靜態方法的
結果會輸出
您好 wlf
Hello wlf
這是最原始的委託
2. 進化爲匿名方法
聲明完委託後 還要聲明方法 是不是很麻煩 如果不聲明方法 用匿名方法 可以幫我們 看 代碼減少了很多吧~
3.再進化爲拉姆達表達式
上面的雖然簡單了不少 但是 還能更簡單的 用拉姆達表達式~
看 這就是拉姆達表達式的演變 一定要會這個~ 因爲在EF LINQ 等 有很多用拉姆達表達式的~
4.用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 裏儘量使用委託和事件 來通訊
這樣可以更好的降低耦合 避免了 子窗體中出現父窗體對象 降低耦合
三.委託的其他資料
四.總結
文章比較入門 希望新手能對委託事件有更好的瞭解 平且能把委託擴展來的東西 熟練運用到工作中 來簡化代碼~ 並且能把事件熟練運用~文章的目的也達到了