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;

 

posted @ 2018-04-06 09:41  黄厚镇  阅读(537)  评论(0编辑  收藏  举报