阅读本文之后,我无法弄清楚为什么使用过lambda表达式。公平地说,我认为我对什么是委托和表达式树类型没有正确的了解,但是我不明白为什么有人会使用lambda表达式而不是声明的函数。有人可以启发我吗?
第一: 简洁和本地化 :
您宁愿编写,阅读和维护哪个文件?这个:
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转换为可在运行时转换为另一查询格式的代码,并发送给服务器进行处理。在客户端上运行的辅助方法很少。