有的時候,我們想要調用一個委托,但同時可以執行多個方法(自定義事件中最為常見),比如,一個工作文檔生成之后,系統要將生成文檔日志,而且還要被保存到數據庫中,對於以上二個操作,如果只想調用一個委托,就可以順序完成,那么使用多播委托,就可以實現。
如果調用多播委托,就可以按順序連續調用多個方法。為此,委托的簽名就必須返回 void (否則,返回值應送到何處?)(當委托只包含一個方法的時候,其返回類型的聲明可以參照所封裝的方法,不一定必須是void)。實際上,如果編譯器發現某個委托返回 void ,就會自動假定這是一個多播委托。
多播委托(MulticastDelegate)提供了一種類似於流水線式的鈎子機制,只要加載到這條流水線上的委托,都會被順序執行。因為所有的委托都繼承自MulticastDelegate,因此所的委托都具備多播特性。
下面通過實例來看一下多播委托:
/// 方法一 static void FirstMethod(string Test) { Console.WriteLine("方法一已經執行完成!"); } /// <summary> /// 方法二 /// </summary> /// <param name="Test"></param> static void SecondMethod(string Test) { Console.WriteLine("方法二已經執行完成!"); }
以上為定義了兩個具有相同簽名的方法,並且沒有返回值。
/// <summary> /// 聲明一個委托,用於實現多播操作 /// </summary> /// <param name="Test"></param> delegate void MyMulticastDelegate(string Test);
又聲明了一個具有和兩個方法相同簽名的委托,來實現我們的多播委托操作。
static void Main(string[] args) { ///首先創建一個委托指向FirstMethod方法 MyMulticastDelegate MyFirst = new MyMulticastDelegate(FirstMethod); ///然后創建一個委托指向SecondMethod方法 MyMulticastDelegate MySecond = new MyMulticastDelegate(SecondMethod); ////將這兩個方法合並到一個多播委托中 MyMulticastDelegate multicastDelegate = MyFirst; //在多播委托的調用鏈中添加新的委托元素 multicastDelegate = multicastDelegate + MySecond; //調用多播委托,並且序列執行兩個委托所指向的方法 multicastDelegate("Test"); Console.Read(); }
然后進行以上操作,執行結果如下: