你的位置:首页 > ASP.net教程

[ASP.net教程]阐述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\n,方法体中是计算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变量了