zoukankan      html  css  js  c++  java
  • 阐述Lambada表达式

    在C#2.0引入匿名方法之前,声明委托的唯一方法就是使用命名方法,C#2.0之后的C#3.0中开始引入了Lambda表达式取代了匿名方法。

    匿名方法

    要说Lambda必然离不开匿名方法,实际上,Lambda的本质就是一个匿名方法,上代码

    class Program
        {
    
            delegate void SayHello(string name);
    
            public static void Main(string[] args)
            {
                SayHello sh1 = HelloMethod;
    
                SayHello sh2 = delegate (string name)//匿名方法
                {
                    Console.WriteLine("Hello:" + name);
                };
    
                sh1("jiming1");
                sh2("jiming2");
    
                Console.Read();
            }
    
            public static void HelloMethod(string name)
            {
                Console.WriteLine("Hello:" + name);
            }
        }

    上述代码中,首先定义了一个委托SayHello,注册到改委托的方法需要有一个string类型的参数,第一个委托对象sh1直接使用的是命名方法HelloMethod,第二个委托对象sh2使用的就是匿名方法.

    Lambda表达式

    lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。参数的个数可以是0、1或多个,只有当输入参数是1个时,Lambda表达式左边的小阔海才可以省略

    示例:

    public static void Main(string[] args)
    {
        Action action = new Action(() => Console.WriteLine("0参数Lambda"));
        action.Invoke();
    
        Console.Read();
    }

    分析:上述代码中,他输入的参数是0,方法主体打印"0参数Lambda"

    示例2:

    public static void Main(string[] args)
    {
        Func<int,int> func = new Func<int,int>(m=>m*2);
    
        Console.WriteLine(func.Invoke(3));
    
        Console.Read();
    }

    上述Lambda表达式的输入参数省略了一对小括弧,它与“(m)=>m*2”Lambda表达式是等效的。这里还包含另外一个C#的语法糖,由于方法体中只有一句话,所以,可以省略{},甚至省略了return,实际上,上述代码的全部写法应该是:

    public static void Main(string[] args)
    {
        Func<int, int> func = new Func<int, int>((m) =>{ return m * 2; });
    
        Console.WriteLine(func.Invoke(3));
    
        Console.Read();
    }

    示例3:

    public static void Main(string[] args)
    {
        Action<int, int> action = new Action<int, int>((m,n)=> {
            int result = m * n;
            Console.WriteLine(result);
        });
    
        action.Invoke(3, 2);
    
        Console.Read();
    }

    上述代码中左边是两个参数,m ,方法体中是计算m*n的结果,然后打印出来,由于方法体中是多行,因此,不能省略{}

    总结:

    1.(x, y) => x * y         //多参数,隐式类型=> 表达式  
    2.x => x * 5              //单参数, 隐式类型=>表达式  
    3.x => { return x * 5; }      //单参数,隐式类型=>语句块  
    4.(int x) => x * 5            //单参数,显式类型=>表达式  
    5.(int x) => { return x * 5; }      //单参数,显式类型=>语句块  
    6.() => Console.WriteLine()   //无参数

    使用Lambda表达式,可以方便快速的编写代码,一些不复用的方法完全可以使用Lambda表达式来写,这样既提高了代码的可读性,也减少了代码量提高可维护性。

    同时Lambda右边方法体内的代码块能够访问Lambda所在方法提所定义的局部变量,这样能够较少参数的定义和传递。

    public static void Main(string[] args)
    {
        string name = "jiming";
    
        Func<int, int,int> func = new Func<int, int,int>((m,n)=> {
            int result = m * n;
            Console.WriteLine(result);
    
            Console.WriteLine(name);
    
            return result;
        });
    
        func.Invoke(3, 3);
    
        Console.Read();
    }

    如上述代码,name变量是定义在Main方法中的,如果不使用Lambda,使用命名方法的话,在命名方法中使用name我需要定义一个变量之后传递进入,而使用Lambda后很方便的就能够访问name变量了

  • 相关阅读:
    2021-4-1 日报博客
    2021-3-31 日报博客
    2021-3-30 日报博客
    2021-3-29 日报博客
    2021-3-27 周报博客
    java
    周末总结六
    java
    java
    java
  • 原文地址:https://www.cnblogs.com/jimmy-y/p/5412835.html
Copyright © 2011-2022 走看看