前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是多播委托?

什么是多播委托?

作者头像
静心物语313
发布2020-03-24 10:14:36
9020
发布2020-03-24 10:14:36
举报
文章被收录于专栏:静心物语313的Coding

说明: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、委托的组合一般是给事件用的,用普通的委托的时候很少用

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档