多播委托

首先定义两个委托和几个方法,后面会用到。

委托:

1  public delegate void M1Delegate();
2
3     public delegate int M2Delegate(int x,int y);

方法:

 1 static int A1(int x,int y)
 2         {
 3             return x + y;
 4         }
 5
 6         static int A2(int x, int y)
 7         {
 8             return x + y;
 9         }
10
11         static int A3(int x, int y)
12         {
13             return x + y;
14         }
15
16         static void M1() {
17             Console.WriteLine("这是M1方法");
18         }
19
20         static void M2()
21         {
22             Console.WriteLine("这是M2方法");
23         }
24
25         static void M3()
26         {
27             Console.WriteLine("这是M3方法");
28         }
29
30         static void M4()
31         {
32             Console.WriteLine("这是M4方法");
33         }
34
35
36         static int N1(int x, int y)
37         {
38             return 10;
39         }
40
41         static int N2(int x, int y)
42         {
43             return 20;
44         }
45
46         static int N3(int x, int y)
47         {
48             return 30;
49         }

一、如何实现多播委托

1             M1Delegate m1 = M1;
2             m1 += M2;
3             m1 += M3;
4             m1 += M4;
5
6             m1 -= M1;
7             m1();

二、多播委托的实现过程(反编译后的源码)

1  M1Delegate m1 = new M1Delegate(M1);
2             m1 = (M1Delegate)Delegate.Combine(m1, new M1Delegate(M2));
3             m1 = (M1Delegate)Delegate.Combine(m1, new M1Delegate(M3));
4             m1 = (M1Delegate)Delegate.Combine(m1, new M1Delegate(M4));
5             m1 = (M1Delegate)Delegate.Remove(m1, new M1Delegate(M2));
6             m1();

输出M1,M3,M4。注意里面的remove方法,我们是新创建了一个委托变量,再删除原来的委托,这点不好理解,反编译后也无法查看原因,暂时记住。

三、多播委托的返回值

1  //这里,多播委托只能取到最后一次方法的值
2             M2Delegate m1 = A1;
3             m1 += A2;
4             m1 += A3;
5             int n = m1(100, 200);
6             Console.WriteLine(n);

输出300;

1             M2Delegate m1 = A1;
2             m1 += N1;
3             m1 += N2;
4             m1 += N3;
5             int n = m1(100, 200);
6             Console.WriteLine(n);//这里,多播委托只能取到最后一次方法的值

输出30;

以上例子说明,多播委托只能取到最后调用的那个方法的返回值,那能否取到多播委托中的所有方法的返回值呢?

 1 //如果让多播委托返回每个方法的值呢?
 2             M2Delegate m1 = A1;
 3             m1 += A1;
 4             m1 += A2;
 5             m1 += A3;
 6             Delegate[] dList = m1.GetInvocationList();
 7
 8             foreach (var item in dList)
 9             {
10                 int n = ((M2Delegate)item)(11, 22);
11                 Console.WriteLine(n);
12             }

时间: 2024-10-27 06:34:49

多播委托的相关文章

Net中委托之二多播委托

本篇主要讲解多播委托 1.多播委托的实例 public class MyDelegate { private delegate int NoParameterWithReturn();//1.声明委托 public static void Show() { NoParameterWithReturn method = new NoParameterWithReturn(ShowSomething);//2.委托的实例化 //多播委托 method += ShowSomething;//按顺序添加

委托和多播委托

刚刚学习了委托的内容,先来说一下自己对委托的理解,权当是复习吧: 委托可以定义在类里面,也可以定义在类外面,如果定义在类里面就只能被这个类调用,不论声明它是public 还是private.如果定义在类外面就能被所有类调用.如果程序是多线程的,委托方法希望能在UI层调用,那么可以在命名空间下定义. //委托的声明 delegate关键字,这个委托只能代表返回值是空.参数是一个string类型的一个方法public delegate void GreetingDelegate(string nam

C#多播委托

概述 在上一篇文章中,笔者就个人理解的委托做了简单的分享,本篇文章主要来说说多播委托.多播委托即每个委托可以包含多个方法. 理解多播委托 多播委托可以保护多个方法,但是在使用的时候需要注意:委托的签名必须是返回void,否则只能调用最后一个方法的得到结果.多播委托派生自System.MulticastDelegate类,System.MulticastDelegate类又派生自System.Delegate.System.MulticastDelegate的其他成员可以允许把多个方法调用链接为一

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托

在"委托.Lambda表达式.事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性"中,反编译委托,发现委托都是多播委托. 既然委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链, 它是怎样形成的?来看下面的例子: namespace ConsoleApplication3 { internal delegate void MySayDel(string msg); class Program { stati

多播委托和匿名方法再加上Lambda表达式

多播委托就是好几个方法全都委托给一个委托变量 代码: 1 namespace 委托 2 { 3 class Program 4 { 5 static void math1() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void math2() 11 { 12 Console.WriteLine("这是第二个方法"); 13 } 14 15 static void Main(string[] args) 1

从多播委托到事件

一.多播委托 前文提到的委托只是在一个委托类型中存储了一个方法(函数),实际上一个委托变量可以同时绑定多个方法,这些委托形成了一个委托链,每一个委托(实际上是方法)都顺序指向下一个委托,这个委托链就是多播委托. 每一个绑定的方法就像是订阅者一样,等着发布者的消息,而触发委托变量的那个就像是发布者,将出发的信号传给所有的订阅者. 1.订阅者 考虑一个温度控制器的例子,这个控制器拥有两个调温器,一个加热器,当温度低于指定的值时,启动,一个冷却器,当温度高于指定的温度时,启动.二者的类设计如下: 1

委托三------------多播委托与匿名方法

============================================多播委托 -------------------------------------主程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 {     class Pr

【C#进阶】多播委托和委托数组像是一回事~

这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { public static void MultiplyByTwo(double value) { Console.WriteLine( "2* {0} = {1}",value,value * 2); } public static void Square(double value) { Conso

多播委托和事件

事件的创造规则是类型必须是一个委托的类型,也就是说是委托实例化了事件 事例代码如下: 这是两个以后要被委托的方法: public class EventManager { //第一个方法 public void Add(int i,int j) { int res = i + j; MessageBox.Show(res.ToString()); } //第二个方法 public void SayHello(int i,int j) { MessageBox.Show("hello word&q