委托篇——Lambda表达式

Lambda表达式是什么?

Lambda 表达式是一种可用于创建 委托或 表达式目录 类型的 匿名函数 (我的理解是:一个被简化的匿名函数)

那什么是匿名函数呢?

匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用。 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数。

话不多说 上图上代码

1.使用匿名函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Studying
{
   public class StudyLambda
    {
        public delegate void weituo();  //定义一个无参有返回值的委托
        public delegate string weituo1();  //无参有返回值
        public delegate void weituo2(string name, int x,int y);//有参无返回值

        //使用委托
        public static void sayhi()
        {
            weituo2 wt = new weituo2(show);
            wt("嬷嬷",18,36);
        }

        private static void show(string name,int x, int y)
        {
            Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x,y);
        }

        //使用匿名函数代替
        public static void incognito()
        {
             weituo2 wt =
                delegate (string name, int x, int y)
                {
                    Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x, y);
                };
            wt("嬷嬷", 18, 36);
        }
    }
}

输出

由以上代码可以看出 使用匿名函数 代替委托实例化以及调用 得出的结果是一致的

2.lambda表达式

前面已经提到过 lambda表达式就是简化的匿名函数 接下来看它是如何一步步简化的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Studying
{
   public class StudyLambda
    {
        public delegate void weituo();  //定义一个无参有返回值的委托
        public delegate string weituo1();  //无参有返回值
        public delegate void weituo2(string name, int x,int y);//有参无返回值

        //使用委托
        public static void sayhi()
        {
            weituo2 wt = new weituo2(show);
            wt("嬷嬷",18,36);
        }

        private static void show(string name,int x, int y)
        {
            Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x,y);
        }

        //使用匿名函数代替
        public static void incognito()
        {
            weituo2 wt =
                delegate (string name, int x, int y)
                {
                    Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x, y);
                };
            wt("嬷嬷", 18, 36);
        }

        // lambda表达式 有参无返回值
        /// <summary>
        /// 1.delegate换成=> 剪头左边是参数列表
        /// 2.去掉参数类型(因为委托调用方法必须要满足约束:即1.参数类型个数一致2.是否有返回值 所以在约束范围内可以不用写参数类型)
        /// 3.去掉{}(可以看到在无返回值里面 当方法体只有一行时{}可以省略)
        /// </summary>
        public static void lam()
        {
            weituo2 wt = (name,x,y)=>Console.WriteLine("今年{0}{1}岁零{2}个月啦~", name, x, y);
            wt("嬷嬷", 18, 36);
        }

        //由于这里是不带返回值的 C#里面有定义好的方法可以直接使用
        Action act = () => { };  //无参无返回值
        Action<string> act1 = s => { Console.WriteLine(""); }; //有参有返回值
        Action<string, int, DateTime> act2 = (a, b, c) => { Console.WriteLine(""); };
    }
}

系统有定义好的无返回值的匿名函数 Action<> 可以给我们直接使用 因为是泛型 所以参数类型也没有限制 上面的例子都是针对有返回值类型的 接下来再来看一下无返回值类型的演变

        //使用匿名函数代替 有返回值
        public static void isret()
        {
            weituo3 wt =
                delegate (int x, int y)
                {
                    return x + y; 
                };
            wt(3,4);
        }

        // lambda表达式 无返回值
        /// <summary>
        /// 1.delegate换成=> 剪头左边是参数列表 参数只有一个时可以省略()
        /// 2.去掉参数类型(因为委托调用方法必须要满足约束:即1.参数类型个数一致2.是否有返回值 所以在约束范围内可以不用写参数类型)
        /// 3.去掉{}(可以看到在有返回值里面 当方法体只有一行时{}和return都可以省略)
        /// </summary>
        public static void isret1()
        {
            weituo3 wt = ( x, y)=> x + y;
            wt(3, 4);
        }

        Func<int> ac = () => 0;//无参有返回值

同样 C#也有自带的有返回值的匿名函数Func<> 不需要我们一个个去定义

接下来看一个实例 :输出大于7的一百以内的数

        public static void linq() {
            List<int> list = new List<int>();
            for (int i = 0; i < 100; i++)
            {
                list.Add(i);
            }

            foreach (int i in list.Where<int>(num=>num>7)) 
            {
                Console.WriteLine(i);
            }
        }

结束

猜你喜欢

转载自blog.csdn.net/qq_38093594/article/details/81661379
今日推荐