什么是多播委托?

说明:1、多播委托就是对一个声明的委托Mydelegate进行多个同类型的方法的赋值;

     2、用委托将这些方法进行,依次的调用;

   3、可以对这些方法进行委托的添加 比如:mdl+=T1;

     4、可以对这些方法进行委托的移除 比如:mdl-=T1;

   5、委托用之前还要判断是否为空;(很重要!)

1、使用委托的两种写法:

     第一种写法:

           MyDel mdl = new MyDel(T1);

 第二种写法:

  MyDel mdl = T1;//第二种写法,其实方法是一样的,反编译工具看,=后边也是被new 出来的

 

 

 

2、当然还可以进行添加,和,移除方法

 

                 mdl += T2;  //可以添加

                 mdl += T3;

             mdl -=T2;   //可以移除

3、委托用之前,需要判断是否为null

 

    if (mdl!=null)//4、委托用之前,需要判断是否为null,这个很重要的!!

            {

                mdl();

        }

 

 

 

附:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace 多播委托

{

    //2、定义委托

    public delegate void MyDel();

    class Program
    {
        static void Main(string[] args)
        {
            //3、第一种写法:

           // MyDel mdl = new MyDel(T1);

 

            MyDel mdl = T1;//第二种写法,其实方法是一样的,反编译工具看,=后边也是被new 出来的

            mdl += T2;  //可以添加

            mdl += T3;

            mdl -=T2;   //可以移除

            if (mdl!=null)//4、委托用之前,需要判断是否为null,这个很重要的!!
            {
                mdl();
            }
            Console.ReadKey();
        }
//1、先定义三个方法 T1、T2、T3 public static void T1() { Console.WriteLine("第一个方法"); } public static void T2() { Console.WriteLine("第二个方法"); } public static void T3() { Console.WriteLine("第三个方法"); } } }

 

 

多播委托链

1、问题:多播委托如何处理返回值?

 

回答:多播委托会只将最后一个委托方法的结果输出来;

 

2、验证:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace 多播委托链
{
    //2、定义委托
    public delegate int Mydel();
    class Program
    {
        static void Main(string[] args)

        {//调用
            Mydel mdl = D1;

            mdl += D2;

            mdl += D3;

            if (mdl!=null)
            {
                mdl();
            }
            Console.WriteLine(mdl());//可以看到这里只是打印出来了第三个方法的结果
            Console.ReadKey();
        }

        //1、先定义三个有返回值的方法

        public static int D1()
        {
            return 1;
        }
        public static int D2()
        {
            return 2;
        }
        public static int D3()
        {
            return 3;
        }
    }
}

 

F11逐步调试,mdl是先被赋值上方法T1、T2、T3、,最后又按顺序再调用了方法,T3方法是最后执行的。

 

总结:

 

1、委托绑定多个方法后,其中一个方法执行发生异常后面的方法还会继续执行吗?不会!

 

 

2、一个重要的方法GetInvocationList();//返回一个Delegate[]类型。Delegate类是一个抽象类,是所有委托的父类。

 

 

3、组合的委托必须是同一个类型

 

 

4、相当于创建了一个按照组合的顺序依次调用的新委托对象。

 

 

5、委托的组合一般是给事件用的,用普通的委托的时候很少用

 

posted @ 2015-05-23 11:02  t800  阅读(429)  评论(0编辑  收藏  举报