zoukankan      html  css  js  c++  java
  • c#之Lambda表达式

    前面我们学习了委托,那么委托与Lambda表达式之间又有什么关系呢?

    一、Lambda表达式

    我们来看一段代码:

        public delegate void NoReturnWithPara(string name, DateTime now);
        public class LambdaShow
        {
            public static void Show()
            {
                NoReturnWithPara method = new NoReturnWithPara(Study);//委托实例化,要求传入的方法必须满足委托的约束
                method.Invoke("jack",DateTime.Now);
            }
            private static void Study(string name,DateTime now) 
            {
                Console.WriteLine("{0}{1}正在学习Lambda表达式",name,now);
            }
        }

    上面一段代码是用委托的形式表现的。接下来我们用Lambda表达看看是怎样的。

        public delegate void NoReturnWithPara(string name, DateTime now);
        public class LambdaShow
        {
            public static void Show()
            {
                NoReturnWithPara method10 = (s, b) => Console.WriteLine("{0}{1}正在学习Lambda表达式", s, b);
                method10.Invoke("jack", DateTime.Now);
            }
            private static void Study(string name,DateTime now) 
            {
                Console.WriteLine("{0}{1}正在学习Lambda表达式",name,now);
            }
        }

    这两段代码的输出结果是一模一样的。

    那么从第一段变成第二段到底是怎样一个过程呢?接下来我们来看看:

    1、将具体的方法变成匿名方法

                NoReturnWithPara method1 = new NoReturnWithPara(
                    delegate(string name,DateTime now) {
                        Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now);
                    });
                method1.Invoke("jack", DateTime.Now);

    2、Lmabda表达式   把delegate换成=>

                NoReturnWithPara method2 = new NoReturnWithPara(
                   (string name, DateTime now)=>
                   {
                       Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now);
                   });//Lmabda表达式   把delegate换成了=>
                method2.Invoke("jack", DateTime.Now);

    3、去掉了参数类型,因为”委托实例化要求传入的方法必须满足委托的约束“

                NoReturnWithPara method3 = new NoReturnWithPara(
                   (name, now) =>
                   {
                       Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now);
                   });
                method3.Invoke("jack", DateTime.Now);

    4、去掉new NoReturnWithPara();

                NoReturnWithPara method4 = (name, now) =>
                   {
                       Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now);
                   };
                method4.Invoke("jack", DateTime.Now);

    5、方法体只有一行,我们可以去掉{}。

                NoReturnWithPara method5 = (name, now) => Console.WriteLine("{0}{1}正在学习Lambda表达式", name, now);
                method5.Invoke("jack", DateTime.Now);

    Lambda表达式就是这样来的。

    二、系统自带的各种委托

    其实我们在开发中,基本是不需要声明委托的,框架为我们提供了一些委托,接下来我们来看看.net框架自带的各种委托。

    1、不带返回值的委托

                Action act1 = () => { };
                //泛型委托
                Action<string> act2 = name => { Console.WriteLine(); };//一个参数的话,可以去掉小括号
                //最多可以有16个参数
                Action<string, int, long, DateTime, char, double, decimal> act3 = (par1, par2, par3, par4, par5, par6, par7) => { }; 

    2、带返回值的委托

                Func<string> fun1 = () => "fdafds";
                Func<DateTime> fun2 = () => DateTime.Now;
                //最多可以有16个参数,带一个返回值
                Func<string, int, long, DateTime, char, double, decimal, DateTime> fun3 = (par1, par2, par3, par4, par5, par6, par7) => DateTime.Now;
                Func<string, int, long, DateTime, char, double, decimal, Action> fun4 = (par1, par2, par3, par4, par5, par6, par7) => act1;
  • 相关阅读:
    第八周总结
    第五周学习总结&实验报告(三)
    第四周课程总结&试验报告(二)
    第三周课程总结&实验报告(一)
    第二周Java学习总结
    2019春学习总结
    第二周基础学习
    第三周编程总结
    2019春第四次课程设计实验报告
    2019春第三次课程设计实验报告
  • 原文地址:https://www.cnblogs.com/hhzblogs/p/8726901.html
Copyright © 2011-2022 走看看