阐述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变量了

原文地址:https://www.cnblogs.com/jimmy-y/p/5412835.html