• .net委托(转载)


    一、什么是委托?

     委托就是定义一个 对于方法的引用,类似于c++中的函数指针。委托是用来将方法作为参数 传递进入其它方法的,

    委托的格式?
     修饰符1 delegate  修饰符2  委托类型名(变量n);
     

     修饰符1 为定义的委托的范围修饰符,常用public;
     修饰符2为 返回值类型修饰符,如 :  void ,string ,char等;
     名字 为我们定义一个委托类型时所为它取得名字;

     对于 变量n  我们常常会有疑惑,委托是一个 方法吗?  为什么会有返回值 以及变量呢 ?
    其实,委托并不是一个方法 ,而是一个 类型,它之所以有返回值以及变量是为了 保持 与其委托的方法 保持一致;

    注意 : 委托是一个 类型  所以我们常常把它定义在一个 类的外面;
     还有 ,委托类型定义之后,我们还不能直接拿过来使用,还需要对它定义该类型的 委托变量;

    格式 :
    修饰符1 delegate  修饰符2  委托类型名(变量n);
    委托类型名   委托变量;


    使用时,还需要注意,我们在使用时要使用定义的委托变量,而不是定义的委托类型名,这类似于我们定义枚举型一样; 因为定义的委托变量是一个变量,所以 在使用之前我们还要对其进行赋值。

    格式: 修饰符1 delegate  修饰符2  委托类型名(变量n);
               委托类型名   委托变量;
               委托变量=委托方法名;

    注意: 这里的委托方法名就是你要委托的方法的名字,而且注意,不要加上了方法的参数以及括号,同时 ,这里委托的方法 还要与 该委托类型定义时所 定义的  返回值类型、参数列表类型以及参数个数  保持一致;  

     我们要先定义一个 方法;
       范围修饰符  【static】 返回值类型修饰符    调用方法名( 变量n, 委托类型  委托变量)
    {
          委托变量(变量n);
             .
             .
             .
        委托变量(变量 n);
    }
     
    上边的变量n就是你所委托的方法的参数;

    开始使用了 :
    1)   委托类型  委托变量; 
    2)   委托变量=委托方法名;
    3)   调用方法名(变量n,委托变量);
    完整示例如下:

     1 using System;
     2 
     3 using System.Collections.Generic;
     4 using System.Text;
     5  
     6 namespace  委托示例
     7 {
     8       public delegate  void del(string str);     //定义的委托类型
     9       calss  示例
    10       {
    11        static void send(string i)     //要委托的方法
    12        {
    13        console.WriteLine(i);
    14        }
    15  
    16        static  void sendup(string list,del  handler)  //调用方法
    17        {
    18          handler(list);
    19        }
    20  
    21        public  static  void  mian(string [] args)    //主方法
    22       {
    23            del  委托变量=send;   // 该句相当于:  del 委托变量; 委托变量=send;
    24            sendup("这是一个 委托的示例!!!",委托变量);
    25            console.ReadKey();
    26           }
    27  
    28        }
    29 }

    二、Action与Func

    Action委托:封装一个方法,该方法具有参数(0到16个参数)并且不返回值

    Func<T,TResult>委托:封装一个方法,该方法具有参数(0到16个)和一个返回值

    实例:

     1 public class DeleDemo
     2     {
     3         /// <summary>
     4         /// 有一个参数但没有返回值
     5         /// </summary>
     6         /// <param name="str"></param>
     7         public static void Say(string str)
     8         {
     9             Console.WriteLine(str);
    10         }
    11         /// <summary>
    12         /// 有两个参数,有一个返回值
    13         /// </summary>
    14         /// <param name="a"></param>
    15         /// <param name="b"></param>
    16         /// <returns></returns>
    17         public static int Add(int a, int b)
    18         {
    19             return a + b;
    20         }
    21         Action<string> action = new Action<string>(Say);     
    22         Func<int, int, int> func = new Func<int, int, int>(Add);
    23 
    24         /// <summary>
    25         /// 将委托作为参数传给方法
    26         /// </summary>
    27         /// <param name="action"></param>
    28         /// <param name="func"></param>
    29         public void Test(Action<string> action,Func<int,int,int> func)
    30         {
    31             action("Hello");
    32             Console.WriteLine(func(1, 2));
    33         }
    34 
    35         /// <summary>
    36         /// 主函数
    37         /// </summary>
    38         public void Main()
    39         {
    40             Test(action, func);  //调用Test方法
    41         }
    42     }    

    三、Predicate

    是返回bool型的泛型委托,Predicate有且只有一个参数,返回值固定为bool。表示定义一组条件并确定指定对象是否符合这些条件的方法。此方法常在集合(Array 和 List<T>)的查找中被用到,如:数组,正则拼配的结果集中被用到。

     1 public class PredicateDemo
     2     {
     3         public int[] myNum = new int[8] { 12, 33, 89, 21, 15, 29, 40, 52 }; //定义一个数据
     4         public int[] myResult; //返回结果
     5 
     6         //定义一个方法,只有一个参数且返回bool类型,判断是否是偶数
     7         public static bool IsEven(int num)
     8         {
     9             if (num % 2 == 0)
    10             {
    11                 return true;
    12             }
    13             else
    14             {
    15                 return false;
    16             }
    17         }
    18         Predicate<int> predicate = new Predicate<int>(IsEven);
    19         
    20         /// <summary>
    21         /// 主程序
    22         /// </summary>
    23         private void Main()
    24         {
    25             //bool res = predicate(23);
    26             myResult = Array.FindAll<int>(myNum, predicate);    //调用      
    27         }
    28     }

    总结:

  • 相关阅读:
    echarts .NET类库开源
    公司笔试题
    ASP.NET Word/Excel 权限问题
    ASP.NET XmlSerializer权限问题
    jQuery Ajax 处理 HttpStatus
    C#调用百度静态地图
    .NET和F#周报第35周-.NET 8月重大更新
    F#.NET周报 2018第34周-Ionide下载量100万
    字符串切分
    最近很火的一首小诗 You are in your TIME ZONE
  • 原文地址:https://www.cnblogs.com/panbin/p/5150255.html
Copyright © 2020-2023  润新知