一尘不染

lambda表达式的意义是什么?

c#

阅读本文之后,我无法弄清楚为什么使用过lambda表达式。公平地说,我认为我对什么是委托和表达式树类型没有正确的了解,但是我不明白为什么有人会使用lambda表达式而不是声明的函数。有人可以启发我吗?


阅读 879

收藏
2020-05-19

共1个答案

一尘不染

第一: 简洁和本地化

您宁愿编写,阅读和维护哪个文件?这个:

    var addresses = customers.Select(customer=>customer.Address);

要么:

static private Address GetAddress(Customer customer)
{
     return customer.Address;
}

... a thousand lines later ...

    var addresses = customers.Select(GetAddress);

当您可以将需要的代码作为一个简短的表达式放在您需要的 地方 时,用数百或数千个四行函数使程序混乱的意义何在?

第二: lambda超出了本地范围

您希望阅读,编写和维护以下内容:

var currentCity = GetCurrentCity();
var addresses = customers.Where(c=>c.City == currentCity).Select(c=>c.Address);

要么:

static private Address GetAddress(Customer customer)
{
     return customer.Address;
}

private class CityGetter
{
    public string currentCity;
    public bool DoesCityMatch(Customer customer)
    {
        return customer.City == this.currentCity;
    }
}

....

var currentCityGetter = new CityGetter();
currentCityGetter.currentCity = GetCurrentCity();
var addresses = customers.Where(currentCityGetter.DoesCityMatch).Select(GetAddress);

使用lambda时,所有麻烦的代码都会为您编写。

第三: 查询理解将为您重写为lambda

当你写:

var addresses = from customer in customers
                where customer.City == currentCity 
                select customer.Address;

它会为您转换为lambda语法。许多人觉得此语法易于阅读,但是我们需要lambda语法才能使其真正起作用。

第四: lambda可以选择类型推断

请注意,在上面的查询理解或lambda版本中,我们不必提供“客户”的类型,但是在将其声明为静态方法时,必须提供形式参数的类型。编译器很聪明,可以根据上下文推断lambda参数的类型。这使您的代码减少了冗余,变得更加清晰。

第五: Lambda可以成为表达树

假设您要询问Web服务器“向我发送居住在当前城市的客户的地址”。您是否要(1)从该网站上删除一百万个客户,并在您的客户端计算机上进行过滤,或者(2)向该网站发送一个对象,告诉它“查询包含当前城市的过滤器,然后地址的选择”?让服务器来工作,并仅将匹配的结果发送给您。

表达式树允许编译器将lambda转换为可在运行时转换为另一查询格式的代码,并发送给服务器进行处理。在客户端上运行的辅助方法很少。

2020-05-19