上位机开发-聊聊多播委托

前言

前几天有学员问到一个关于多播委托的问题:

假设一个委托绑定了多个带有返回值的方法,直接调用只能获取到最后一个方法的结果,如何获取到所有方法的结果?

多播委托

今天跟大家聊聊关于多播委托,顺便解决一下这个学员的问题。

不同的人对委托的理解可能有所不同,委托的本质是一个方法的指针,它不仅可以指向某一个方法,还可以同时指向多个方法,具体是通过绑定的方式来实现,就是我们常用的+=。

如果一个委托绑定了多个方法,就叫做多播委托。

Action实例

我们先用Action来做个简单的例子。

Action是系统委托,说白了就是微软为了方便开发人员,帮我们声明好的委托,它是没有返回值的。

首先创建一个委托对象,以大家熟悉的计算器案例为例:

        /// 
        /// 创建计算器的委托对象
        /// 
        public Action Caculator;

然后编写四个方法,分别为加减乘除——Add、Minus、Multi、Div,方法里直接输出运算结果。

        private void Add(int a, int b)
        {
            Console.WriteLine(a+b);
        }

        private void Minus(int a, int b)
        {
            Console.WriteLine(a - b);
        }

        private void Multi(int a, int b)
        {
            Console.WriteLine(a * b);
        }

        private void Div(int a, int b)
        {
            Console.WriteLine(a / b);
        }

接着我们写下委托绑定,将委托对象依次绑定上这4个方法。

            this.Caculator += Add;
            this.Caculator += Minus;
            this.Caculator += Multi;
            this.Caculator += Div;

最后,调用一下委托,分别传递4和2这两个值进去。

           this.Caculator(4, 2);

运行看下结果:

上位机开发——聊聊多播委托

我们可以看到分别输出了加减乘除的结果。

Func实例

上面的这个结果是符合我们预期的。

但是如果我们的方法有返回值呢,那么我们创建委托就需要用Func,Func也是系统委托,与Action不同的是,它是有返回值的。

我们重新用Func创建一个委托对象,仍然以计算器案例为例:

        /// 
        /// 创建计算器的委托对象
        /// 
        public Func Caculator;

然后我们将加减乘除的方法修改一下,不然肯定会报错的,因为方法的模型一定要与委托的模型保持一致,具体就是参数个数、类型及返回值个数、类型必须保持一致。

        private int Add(int a, int b)
        {
            return a + b;
        }

        private int Minus(int a, int b)
        {
            return a - b;
        }

        private int Multi(int a, int b)
        {
            return a * b;
        }

        private int Div(int a, int b)
        {
            return a / b;
        }

这样就可以正常绑定了,绑定的代码不需要修改。

最后我们还是调用一下:

         Console.WriteLine(this.Caculator(4, 2));

只不过这个Func是有返回值的,我们将结果输出出来。

上位机开发——聊聊多播委托

我们看到的结果就是学员的那个问题,只输出了一个结果,这个结果是最后一个方法——除法的结果。

解决方案

那么如果想要获取所有的方法结果,放到一个集合里,能不能实现呢?

当然是可以的。

我们修改一下调用的代码:

            List result = new List();

            foreach (Func delegateAction in Caculator.GetInvocationList())
            {
                result.Add(delegateAction(4, 2));
            }  
            
            result.ForEach(c=>Console.WriteLine(c));

运行看下输出结果:

上位机开发——聊聊多播委托

各位同学,你们明白了吗。

我是新阁上位机开发付老师,欢迎大家一起交流探讨。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章