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);
然后使用+= 来添加委托,使用-=来移除委托。

posted on 2012-06-28 07:28  流星落  阅读(2225)  评论(0编辑  收藏  举报

导航