zoukankan      html  css  js  c++  java
  • 委托

      委托的概念

    委托太常见了,能灵活运用可以使你在编程中游刃有余。

    简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度更小的“接口”(约束了指向方法的签名)

     委托的简单使用

    一个委托类型定义了该类型的实例能调用的一类方法,这些方法含有同样的返回类型和同样参数(类型和个数相同)。委托和接口一样,可以定义在类的外部。如下定义了一个委托类型

    delegate int Calculator (int x);

    此委托适用于任何有着int返回类型和一个int类型参数的方法,如:

    static int Double (int x) { return x * 2; }

    创建一个委托实例,将该此方法赋值给该委托实例:

    Calculator c = new Calculator(Double);

    也可以简写成:

    Calculator c = Double;

    这个方法可以通过委托调用:

    int result = c(2);

     用委托实现插件式编程

    我们可以利用“委托是一个能把方法作为参数传递的对象”这一特点,来实现一种插件式编程。

    例如,我们有一个Utility类,这个类实现一个通用方法(Calculate),用来执行任何有一个整型参数和整型返回值的方法

    示例代码如下:

            delegate int Calculator(int x);

     

            class MyProgram

            {

                static int Double(int x) { return x * 2; }

                static void Main(string[] args)

                {

                    int[] values = { 1, 2, 3, 4 };

                    Utility.Calculate(values, Double);

                    foreach (int i in values)

                        Console.Write(i + " "); 

     

                    Console.ReadKey();

                }

            }

     

     

            class Utility

            {

                public static void Calculate(int[] values, Calculator c)

                {

                    for (int i = 0; i < values.Length; i++)

                        values[i] = c(values[i]);

                }

        }

     多播委托

    所有的委托实例都有多播的功能。所谓多播,就像一群程序员在瞬聘网填好了求职意向后,某天有个公司发布了一个和这些程序员求职意向刚好相匹配的工作,然后这些求职者都被通知了 - “有一份好工作招人啦,你们可以直接申请去上班了!”。也就是说,一个委托实例不仅可以指向一个方法,还可以指向多个方法

     静态方法和实例方法对于委托的区别

    当一个类的实例的方法被赋给一个委托对象时,在上下文中不仅要维护这个方法,还要维护这个方法所在的实例。System.Delegate 类的Target属性指向的就是这个实例

      泛型委托

    如果你知道泛型,那么就很容易理解泛型委托,说白了就是含有泛型参数的委托,例如:

    public delegate T Calculator<T> (T arg);

      Func 和 Action 委托

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action。如下所示(下面的in表示参数,out表示返回结果):

    delegate TResult Func <out TResult> ();delegate TResult Func <in T, out TResult> (T arg);delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2); ... 一直到 T16

     delegate void Action ();delegate void Action <in T> (T arg);delegate void Action <in T1, in T2> (T1 arg1, T2 arg2); ... 一直到 T16

      委托的兼容

    委托的类型兼容

    参数类型兼容

    返回值类型兼容

  • 相关阅读:
    config 文件夹中的 dev.env.js
    config 文件夹中的 index.js
    Dialog 对话框 可拖拽
    Pagination 分页 封装
    ElasticSearch学习03--使用Java连接ES
    ElasticSearch学习02--使用Kibana管理ES
    ElasticSearch学习01--基本结构与操作
    redis学习02--使用Jedis调用Redis
    redis学习01--常用命令
    Java基础学习08--JDK1.8特性
  • 原文地址:https://www.cnblogs.com/d0975/p/10644493.html
Copyright © 2011-2022 走看看