什么是多播委托?

2020-03-24 10:14:36 浏览数 (1)

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

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

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

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

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

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

代码语言:javascript复制
第一种写法:
           MyDel mdl = new MyDel(T1);
 第二种写法:
  MyDel mdl = T1;//第二种写法,其实方法是一样的,反编译工具看,=后边也是被new 出来的

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

mdl = T2; //可以添加

mdl = T3;

mdl -=T2; //可以移除

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

代码语言:javascript复制
if (mdl!=null)//4、委托用之前,需要判断是否为null,这个很重要的!!
            {
                mdl();
        }

附:

代码语言:javascript复制
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、验证:

代码语言:javascript复制
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、委托的组合一般是给事件用的,用普通的委托的时候很少用

0 人点赞