所有的委托實例都有多播的功能。所謂多播,就像一群程式員在瞬聘網填好了求職意向後,某天有個公司發佈了一個和這些程式員求職意向剛好相匹配的工作,然後這些求職者都被通知了 - “有一份好工作招人啦,你們可以直接申請去上班了!”。 也就是說,一個委托實例不僅可以指向一個方法,還可以指向多個方法。例如: My ...
所有的委托實例都有多播的功能。所謂多播,就像一群程式員在瞬聘網填好了求職意向後,某天有個公司發佈了一個和這些程式員求職意向剛好相匹配的工作,然後這些求職者都被通知了 - “有一份好工作招人啦,你們可以直接申請去上班了!”。
也就是說,一個委托實例不僅可以指向一個方法,還可以指向多個方法。例如:
MyDelegate d = MyMethod1;// “+=” 用來添加,同理“-=”用來移除。 d += MyMethod2;// d -= MyMethod2
調用時,按照方法被添加的順序依次執行。註意,對於委托,+= 和 -= 對null是不會報錯的,如:
MyDelegate d; d += MyMethod1;// 相當於MyDelegate d = MyMethod1;
為了更好的理解多播在實際開發中的應用,我用模擬瞬聘網的職位匹配小工具來做示例。在職位匹配過程中會有一段處理時間,所以在執行匹配的時候要能看到執行的進度,而且還要把執行的進度和執行情況寫到日誌文件中。在處理完一個步驟時,將分別執行兩個方法來顯示和記錄執行進度。
我們先定義一個委托(ProgressReporter),然後定義一個匹配方法(Match)來執行該委托中的所有方法。如下:
public delegate void ProgressReporter(int percentComplete); public class Utility { public static void Match(ProgressReporter p) { if (p != null) { for (int i = 0; i <= 10; i++) { p(i * 10); System.Threading.Thread.Sleep(100); } } } }
然後我們需要兩個監視進度的方法,一個把進度寫到Console,另一個把進度寫到文件。如下:
class Program { static void Main(string[] args) { ProgressReporter p = WriteProgressToConsole; p += WriteProgressToFile; Utility.Match(p); Console.WriteLine("Done."); Console.ReadKey(); } static void WriteProgressToConsole(int percentComplete) { Console.WriteLine(percentComplete+"%"); } static void WriteProgressToFile(int percentComplete) { System.IO.File.AppendAllText("progress.txt", percentComplete + "%"); } }
運行結果:
看到這裡,是不是發現你已然更加愛上C#了。