zoukankan      html  css  js  c++  java
  • 多播委托

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

    委托:

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

    方法:

     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         }
    View Code

    一、如何实现多播委托

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

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

    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();
    View Code

    输出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);
    View Code

    输出300;

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

    输出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             }
    View Code
  • 相关阅读:
    徒手画个disk不容易啊。。。
    fast powf
    SSE sqrt还是比C math库的sqrtf快了不少
    Mongoose也是个大坑
    A tiny program to benchmark image transpose algorithms
    On extracting ops from LLVM backend
    Into concurrent LRU caching once again
    性能大坑
    多项式在线拟合神器
    Spark 1.6.1源码编译
  • 原文地址:https://www.cnblogs.com/wesley168/p/6782482.html
Copyright © 2011-2022 走看看