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