上課筆記:C# Advanced Topics: Take Your C# Skills to the Next Level
Delegates
- An object that knows how to call a method (or a group of methods)
- 在 invocationList 中可以看到要委派的 Method
- 而因為 delegate 是繼承 System.MulticastDelegate,因此可以知道說我們要委派給誰
- A reference to a function
用途
- 在設計應用程式時更具有擴充性以及彈性。
- 讓使用的人可以不需要再重新編譯原本的 Library 的情況下,還能增加需要的功能(方法)。
情境
我們現在有一個照片的處理程序,他可以套用不同的濾鏡
1 | // 相片類別 |
1 | // 來處理一下照片 |
上述的程式碼,從設計上來看 PhotoProcessor 裡面在套用濾鏡 PhotoFilters,它不具有太大的可動性(彈性),也就是說我如果要在同一個應用程式使用不同的濾鏡,我就必須寫另一個 PhotoProcessor,更甚者,重新修改原本的 PhotoProcessor,那我們可以怎麼透過 delegate 來讓他具有可動性(彈性)呢? 在 PhotoProcessor 中動手
1 | // 修改 相片程序的類別 |
1 | // 來處理一下照片 |
那如果要在加另外一個 filter 呢?
1 | // 來處理一下照片 |
甚至是,我不要用 PhotoFilters 內的 filter 也行,我自己來新建一個
1 | // 來處理一下照片 |
缺點
- 在 Delegate 中,方法的簽章要與 宣告 delegate 的簽章一樣,因次遇到需要傳入多種不同或是型別的參數時,勢必要寫出一堆 delegate。
- 因此在 C#2.0 開始,在 .Net Framework 內建了 Action、Func。
- 上述提到的 Action、Func,都是可以使用 Generic 的
在上述缺點有提到兩樣 Generic Delegate:Action 跟 Func
若把 Action 用在 上面的情境,可以這樣使用
1 | // 修改 相片程序的類別 |
1 | // 來處理一下照片 |
那麼,跟 Delegate 有一樣的功效的解法是什麼? Interface
Interfaces or Delegates
那怎麼抉擇? 這個因人而異啦~ 每個人都有自己的想法以及用法
不過在 微軟的 MSDN 有寫到,可以參考一下,這部份還沒有整理….