C#委托-多播委托调用多个方法

我们可不可以将两个以上的方法委托给一个对象呢?当然可以。多播委托就是指引用多个方法委托,它也是一个委托,当调用委托时,它连续调用每个方法,只要这些方法的签名与委托的定义相同。

为了把委托的单个实例合并为一个多播委托,委托必须是同类型的,返回类型必须是void,不能带输出参数(但可以带引用参数),如果委托是有返回值的函数,则只能调用最后一个委托函数。

当调用多播委托里,委托所表示的每个方法依次调用。如果有任何参数,它们将用于所有的方法。

多播委托:

1.委托声明包含的方法返回值必须为void,否则会抛出run-time exception。

2.使用“+”、“+=”添加方法,“-”、“-=”删除方法。

3.声明和实例化都和其他委托没有什么不同。

多播委托的示例程序:

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApp1

{

//声明一个委托

public delegate void msg();

//编写一个类

class messges

{

//messges类下的一个成员方法m1

public static void m1()

{ Console.WriteLine("方法一被huashanlin调用"); }

//messges类下的一个成员方法m2

public static void m2()

{ Console.WriteLine("方法二被huashanlin调用"); }

//messges类下的一个成员方法m3

public static void m3()

{ Console.WriteLine("方法三被huashanlin调用"); }

}

//另一个类

class Program

{

//该类下包含的主函数

static void Main(string[] args)

{

//实例化一个委托,并封装messges类中的一个方法m2

msg ms = new msg(messges.m2);

//在原有的封装了一个m1方法的委托实例中再封装进一个新

的方法m1

ms = ms + messges.m1;

//或者上面的语句可以写成ms += messges.m1;两者的效果

是一样的

//以下为该委托实例封装第三个方法

ms += messges.m3;

//调用该委托实例,那么由于多播委托之后调用该委托就要

执行完此封装进去的三个方法

ms();

}

}

}

//注:deletge保存的方法签名是以hash队列的形式存在的

多播委托示例程序二:

delegate void Delegate_Multicast(int x, int y);

Class Class2

{

static void Method1(int x, int y)

{

Console.WriteLine("You r in Method 1");

}

static void Method2(int x, int y)

{

Console.WriteLine("You r in Method 2");

}

public static void Main()

{

Delegate_Multicast func = new Delegate_Multicast(Method1);

func += new Delegate_Multicast(Method2);

func(1, 2); // Method1 and Method2 are called

func -= new Delegate_Multicast(Method1);

func(2, 3); // Only Method2 is called

}

}解析:

上面的示例程序分别定义了名为method1 和 method2的两个接受整型参数、返回类型为void的方法。

在Main函数里使用下面的声明创建委托对象:

Delegate_Multicast func = new Delegate_Multicast(Method1);

然后使用+= 来添加委托,使用-=来移除委托。