本篇我们来讨论C#中的Lambda表达式。本篇会使用上一篇文章:C#委托中的Person类,代码如下
public delegate void MyDelegate();
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void ZhuangBi(MyDelegate findTopic, MyDelegate findPerson)
{
//首先,找到话题
findTopic();
//然后,找到一个能够聊天的人
findPerson();
Console.WriteLine("I am newbility");
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person();
MyDelegate delegate_FindTopic = FindTopic;
MyDelegate delegate_FindPersonToTalk = FindPersonToTalk;
p.ZhuangBi(delegate_FindTopic, delegate_FindPersonToTalk);
}
static void FindTopic()
{
Console.WriteLine("MongoDB is not too bad");
}
static void FindPersonToTalk()
{
Console.WriteLine("find a geek");
}
}
我们现在思考这样一个问题啊,我这个人有强迫症,我觉得我在Program这个类中定义的两个方法FindTopic和FindPersonToTalk的功能都这么简单,能不能在调用Person.ZhuangBi这个方法时更加简化呢?
我们可以使用Lambda表达式。Lambda表达式本质上是一个匿名方法,顾名思义,匿名方法也是方法,只不过是没有方法名。可是,没有方法名怎么调用它呢?我们可以使用委托来调用它。
让我们使用Lambda表达式来改造一下我们的Program类
class Program
{
static void Main(string[] args)
{
Person p = new Person();
MyDelegate delegate_FindTopic = () => { Console.WriteLine("MongoDB is not too bad"); };
MyDelegate delegate_FindPersonToTalk = () => Console.WriteLine("find a geek");
p.ZhuangBi(delegate_FindTopic, delegate_FindPersonToTalk);
}
}
这样子写的好处是,我就不需要再为这两个简单的功能专门写两个方法了。如果你把代码复制到本地编译运行一下,结果是可以正常输出的。如果现在看不懂的话没关系,下面我们会介绍Lambda表达式的语法,看完语法后再来看这段代码,你也许就明白了。
下面我们来讲一些关于Lambda表达式的语法问题
Lambda表达式最基本的形式是
(input parameters) => expression
(input parameters) => {}
我们上面说Lambda表达式本质上是一个方法,所以它就包含参数列表和返回值。上面的两种形式,第一种的箭头后面是一个表达式,第二种的后面是一个代码段。如果有返回值的话,第一种的表达式就是返回值,而第二种的返回值会在语句段中使用return关键字指定,跟一般的方法一样。例如,我们定义两个个Lambda表达式,都实现两个整数相加
Func<int, int, int> myFunc1 = (int a, int b) => a + b;
Func<int, int, int> myFunc2 = (int a, int b) => { return a + b; };
Func< int, int, int>是系统定义的泛型委托,第一个泛型参数int是返回值,后面两个泛型参数int是参数列表。
仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔。下面我们定义一个Lambda表达式,求一个整数的平方,下面这几种写法都可以
Func<int, int> myFunc3 = x => x * x ;
Func<int, int> myFunc4 = (x) => { return x * x; };
Func<int, int> myFunc5 = (int x) => { return x * x; };
Func<int, int> myFunc6 = x => { return x * x; };
参数是int型的x,返回值是 x*x。由于我们的委托类型Func< int, int>已经指定了方法的参数类型和返回值类型,所以,在Lambda表达式中,参数的类型可以省略。
Lambda表达式一般都跟委托一起使用。在Linq中也比较常用。