zoukankan      html  css  js  c++  java
  • 委托、泛型委托等

    委托是一种指向方法的数据类型,是一种类型安全的函数指针。这里学习一些具体的用法。

    一、基本写法
    委托的关键词为delegate,使用委托需要先给出函数签名,比如:
    delegate string MyDel1(string s, string s1);
    这里定义了一个名为MyDel1的委托,要求指向的函数为两个string参数,输出为string,M1即符合函数签名。

    static string M1(string s, string s1) {
      return s + s1;
    }
    将委托指向函数M1的写法为:
    MyDel1 d1 = new MyDel1(M1);
    也可以简化为:
    MyDel1 d1 = M1;
    最后调用被指向函数时,用Invoke,并传入需要的参数。
    var result1 = d1.Invoke("s", "s1");
    简化写法为,直接在d1后面加括号,如果要求参数则传入。
    var result = d1("s", "s1");

    二、泛型委托及应用
    a)泛型委托可以扩展函数签名的使用范围,之前的MyDel的参数类型只能是string,而如果定义成delegate T1 MyDel2< T1, T2,T3>(T2 t2, T3 t3);则可以在使用委托时才指定参数类型。
    b)有获取数组元素最大值的方法如下,只提供的排序算法的公用部分,具体的比较方法作为委托CompareFunc1<T>传入:

    static T GetMax1<T>(T[] arr, CompareFunc1<T> func) {
      T max = arr[0];
      for (int i = 1; i < arr.Length; i++) {
        if (func(arr[i], max)) {
          max = arr[i];
        }
      }
      return max;
    }
    delegate bool CompareFunc1<T>(T o1, T o2);


    使用GetMax1需要给出排序方法,这种做法比较灵活,尤其对于非值类型来说。

    三、内置委托
    .Net类库中内置了两个泛型委托Action和Func,Action为无返回值的委托,一共有16个重载,最多可以定义16个参数。
    public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
    Func有返回值,输入参数从0-16个,一共17个重载,Func的形式为,最后一个泛型参数必须对应输出值。
    public delegate TResult Func<in T, out TResult>(T arg);

    学习资料:如鹏网.net提高班http://www.rupeng.com/News/10/4603.shtml

     

     

    欢迎关注公众号【菜鸟程序员成长记】

  • 相关阅读:
    Gin 使用 websocket
    7天用Go从零实现Web框架Gee教程
    docker-compose 搭建 Redis Sentinel 测试环境
    关闭禁用 Redis 危险命令
    Redis Cluster 设置密码
    使用 twine 上传自己的 python 包到 pypi
    Redis 5.0.7 讲解,单机、集群模式搭建
    Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析
    django 重写 mysql 连接库实现连接池
    编译安装httpd-2.4
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/7663470.html
Copyright © 2011-2022 走看看