委托详解(匿名函数、Lamda表达式、多播委托)

来源:互联网 发布:小内存win10平板优化 编辑:程序博客网 时间:2024/06/05 02:55
1、匿名函数:
     匿名函数适合在方法只调用一次的情况下使用。
每次都为这个方法编写方法语法,就太麻烦了,因此程序员发明了匿名的方法
    使用语法:
        委托类型  委托变量 = delegate(类型 参数列表)
        {
            方法体
        };

5、Lamda表达式:
          是匿名函数的另一种形式
使用语法: (   =>     读作goes to)
        委托类型 委托变量 = (参数列表) => 方法体 ;
        注意:
            (1)如果参数列表没有参数,只需要写一对圆括号即可,如:()=>;
            (2)如果参数只有一个,可以省略圆括号,例如:e=>
            (3)如果方法体只有一句话,可以省略花括号;
            (4)如果方法只有一句话,返回的return,可以省略
6、多播委托(multicast delegate)
       (1) 多播委托可以实现的功能:
                  注册多个方法,调用时将这些方法依次执行一遍
        (2) 实现语法:
            a、准备委托变量
            b、第一个方法使用=赋值
            c、后面的方法使用+=赋值
  通过使用 +=符号进行多播委托方法的注册,注册后就可以依次进行委托方法的调用。
(3)通过 -= 符号可进行已注册方法的移除
(4)多播委托在执行中可以有返回值,但是一般不使用

委托应用例子:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 委托{    //    //本代码是实现求一个数组中的最大值,可比较数字类型、字符串类型、名字等等。    //在比较过程中,for循环部分是重复的代码,故可利用委托来减少代码重复量    //    //构造委托类型    public delegate int DelCompare(object o1, object o2);
    class Program    {        static void Main(string[] args)        {            object[] arr = {"lohv","fudsfd","lkjhgfvbnjydaghfjak","bhsdfgs"};            //方式一: 正常委托方式  (通过调用已创建的函数的方式进行委托调用)            object result1 = GetMax(arr, Compare2);            //方式二:匿名函数  匿名函数适用于方法只调用一次的情况。 不需要另外单独再构造方法            object resul2t = GetMax(arr, delegate(object o1, object o2)            {                string s1 = (string)o1;                string s2 = (string)o2;                return s1.Length - s2.Length;            });            //方式三:Lamda表达式   (参数)=>{方法体};  Lamda表达式是本质也是匿名函数            //匿名函数适用于方法只调用一次的情况。 不需要另外单独再构造方法            object result3 = GetMax(arr, (object o1,object o2) => {                string s1 = (string)o1;                string s2 = (string)o2;                return s1.Length - s2.Length;            });            Console.WriteLine(result);            Console.ReadKey();        }        //构建的主要的方法,这一部分是所有方法可以重用的部分,通过传入委托来减少代码的重复量        public static object GetMax(object[] nums, DelCompare del)        {            object max = nums[0];            for (int i = 0; i < nums.Length; i++)            {                //要传一个比较的方法                if (del(max, nums[i]) < 0)                {                    max = nums[i];                }            }            return max;        }        //要进行委托的方法,比较数字类型大小的方法        public static int Compare1(object o1, object o2)        {            int n1 = (int)o1;            int n2 = (int)o2;            return n1 - n2;        }        //要进行委托的方法,比较字符串类型大小的方法        public static int Compare2(object o1, object o2)        {            string s1 = (string)o1;            string s2 = (string)o2;            return s1.Length - s2.Length;        }    }}


0 0
原创粉丝点击