有的時候,我們想要調用一個委托,但同時可以執行多個方法(自定義事件中最為常見),比如,一個工作文檔生成之后,系統要將生成文檔日志,而且還要被保存到數據庫中,對於以上二個操作,如果只想調用一個委托,就可以順序完成,那么使用多播委托,就可以實現。
如果調用多播委托,就可以按順序連續調用多個方法。為此,委托的簽名就必須返回 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();
}
然后進行以上操作,執行結果如下:

