• 委托(2).net 1.x中的委托


      上一篇已经演示了使用委托实现一个多语言问候的程序,这一篇文章来总结一下在.net 1.x中委托的使用方法。

      既然委托是一个类型(class),那么它就要经历像类一个先声明,然后new一个对象,最后调用的过程。

    .net 1.x中的委托

    在.net 1.x中委托的使用是这样的,如下代码:

     1 namespace DelegateDemo
     2 {
     3     //声明委托
     4     public delegate void MyDel(string arg1, string arg2);
     5 
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             //.net 1.x中的委托
    11             Class1 c1 = new Class1();
    12 
    13             //创建委托对象
    14             MyDel myDel1 = new MyDel(c1.InstanceMethod);//实例方法
    15             MyDel myDel2 = new MyDel(Class1.StaticMethod);//静态方法
    16 
    17             //调用委托
    18             myDel1("a", "b");//或者myDel1.Invoke("a", "b");
    19             myDel2("a", "b");//或者myDel2.Invoke("a", "b");
    20 
    21             Console.ReadKey();
    22         }
    23     }
    24 
    25     public class Class1
    26     {
    27         public void InstanceMethod(string arg1, string arg2)
    28         {
    29             Console.WriteLine(string.Format("arg1:{0},arg2:{1}", arg1, arg2));
    30         }
    31 
    32         public static void StaticMethod(string arg1, string arg2)
    33         {
    34             Console.WriteLine(string.Format("arg1:{0},arg2:{1}", arg1, arg2));
    35         }
    36     }
    37 }

    从上面代码可以总结:

    1,委托既可以接受实例方法,也可以接受静态方法,只要方法的签名和返回值类型与委托匹配即可。

    2,调用委托有两种方法,第1种本质上也是调用委托的Invoke方法。

    赋值委托

    上面是使用new DelegateType()的方式创建委托的,其实可以使用更简单的方式来创建委托的。上面的创建委托的代码可以简化为:

    1 //创建委托对象
    2 MyDel myDel1 = c1.InstanceMethod;//实例方法
    3 MyDel myDel2 = Class1.StaticMethod;//静态方法

    为委托增加和移除方法

    上面的例子,创建委托时只初始化了一个方法,其实委托可以添加多个方法的,添加方法通过'+=',移除方法通过'-='来实现,如下代码:

    1 //创建委托对象
    2 MyDel myDel = c1.InstanceMethod;
    3 myDel += c1.InstanceMethod2;
    4 myDel += Class1.StaticMethod;
    5 myDel += Class1.StaticMethod2;

    1,由多个委托组成的就是链式委托(或称多播委托),System.MulticastDelegate类便是为链式委托而设计的。

    2,+=本质上调用的是Delegate.Combine方法。

    调用委托

    调用委托跟调用方法一样简单,只需要传入委托要求的参数,这些参数将用于调用委托的方法列表中的每一个方法,并且是依次序调用,如下代码:

    1 //调用委托
    2 myDel("aaa","bbb");

    链式委托之所以能够依次调用,原因是System.MulticastDelegate内部维护了一个指向下一个委托的指针。

    输出结果:

    注意:

    1,如果为委托添加了多个相同的方法,那么这些方法都会被重复调用。

    2,如果委托有返值,并且委托的调用方法列表中包含多个方法,那么只会返回最后一个方法的返回值,其它的返回值都会被忽略。

    最后用XMind来总结一下:

  • 相关阅读:
    rust 实战 实现一个线程工作池 ThreadPool
    rust Cell 与 RefCell的区别
    使用pre标签显示原始文本并自动换行
    rust实战 newtype模式
    什么是幻读,怎么解决幻读
    rust match 模式匹配摘录
    Elasticsearch 8的版本来了;可以直接在 Elasticsearch 中使用 PyTorch Machine Learning 模型
    神奇的库 phone
    python中单例的实现
    斐波那契查找
  • 原文地址:https://www.cnblogs.com/mcgrady/p/6963935.html
Copyright © 2020-2023  润新知