首页 > 代码库 > 多播委托(from www.sysoft.cc)

多播委托(from www.sysoft.cc)

一个委托类型实列不仅可以绑定一个方法,其实可以实现多个方法的绑定,即多播委托,或委托链。
如下:

namespace 多播委托
{//定义具有反回值无参数的委托类型变量
    public delegate int weito();
    class Program
    {
        static void Main(string[] args)
        {//建立对应委托类型实列,并指定方法,通过增加方式,实现委托多播。
            //委托执行一般按照增加方法的顺序进行。
            weito kk = new weito(M1);
            kk += M2;
            kk += M3;
            kk += M4;
            Console.WriteLine(kk());//具有反回值的多播委托,最终只能返回最后添加方法的返回值。
            Console.WriteLine("------------------遍历取得多播委托方法反回值-----------------");
            Delegate[] delkks = kk.GetInvocationList();
            //可能通过遍历,调用委托中每个方法,实现分步获取委托中的返回值。
            //可以通过.GetInvocationList()方式获得当前委托中存储的所有方法。
            //其反回值类型是一个Delegate[]数组(委托数组)
            //其所有反回的委托均继承自抽像类MultiCastdelegate,而MultiCastdelegage又继承自抽像类Delegate。
            //多播委托内部是将绑定在委托内部的多个方法,强制转换成了一个委托对象,并且将其存储在了一个叫_invocationList的object数组中。
            //当调用委托时,遍历object数组,执行相对应的函数。
            foreach (Delegate itemdelegate in delkks)
            {
                weito method = (weito)itemdelegate;
                int k = method();
                Console.WriteLine(k);
            }
            Console.ReadKey();
        }
        static int M1()
        {
            return 1;
        }
        static int M2()
        {
            return 2;
        }
        static int M3()
        {
            return 3;
        }
        static int M4()
        {
            return 4;
        }
    }



注意:1、当多播委托绑定的方法有出现异常时,则此方法以后的方法不再执行。
            2、委托进行方法增加或去除绑定只能用‘+=’或‘-=‘,如果直接使用‘=’则会将该委托变量绑定的所有方法覆盖掉。
           3、多播委托绑定的第一个方法只能用‘+=‘。
           4、委托同string一样,具有不可变的特性。
多播委托内存分配原理图(delegate k=new delegate(M1);k+=k2;)

图片

多播委托(from www.sysoft.cc)