lambda表达式的重点是什么?

Joh*_*hey 17 c# lambda delegates

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

Eri*_*ert 60

第一:简洁和地方:

你更喜欢写,读和维护?这个:

    var addresses = customers.Select(customer=>customer.Address);
Run Code Online (Sandbox Code Playgroud)

要么:

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

... a thousand lines later ...

    var addresses = customers.Select(GetAddress);
Run Code Online (Sandbox Code Playgroud)

如果您只需将需要的代码作为简短表达式放在需要的地方,那么将程序与数百或数千个四行函数混为一谈的重点是什么?

第二:lambdas靠近本地范围

您更愿意阅读,编写和维护这个:

var currentCity = GetCurrentCity();
var addresses = customers.Where(c=>c.City == currentCity).Select(c=>c.Address);
Run Code Online (Sandbox Code Playgroud)

要么:

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);
Run Code Online (Sandbox Code Playgroud)

当您使用lambda时,所有烦人的代码都是为您编写的.

第三:查询理解被重写为lambdas

当你写:

var addresses = from customer in customers
                where customer.City == currentCity 
                select customer.Address;
Run Code Online (Sandbox Code Playgroud)

它会被转换为lambda语法.许多人发现这种语法很难阅读,但我们需要lambda语法才能真正使用它.

第四:lambda是可选的类型推断

请注意,我们不必在上面的查询理解中或lambda版本中给出"customer"类型,但是在将它声明为静态方法时,我们必须给出形式参数的类型.编译器很聪明地从上下文推断lambda参数的类型.这使您的代码更少冗余,更清晰.

第五:Lambdas可以成为表达树

假设您要求Web服务器"向我发送当前城市中客户的地址".您是否希望(1)从网站上下载一百万客户并在客户端计算机上进行过滤,或者(2)向网站发送一个对象,告诉它"查询包含当前城市的过滤器,然后选择地址"?让服务器完成工作并仅向您发送匹配的结果.

表达式树允许编译器将lambda转换为可在运行时转换为另一种查询格式并发送到服务器进行处理的代码.在客户端上运行的小助手方法不会.

  • +1 Lippert获胜.基本上总结了整篇文章5分钟.疯. (3认同)

Jar*_*Par 5

在声明的函数中使用lambda的主要原因是需要在委托表达式中使用一段本地信息.例如

void Method(IEnumerable<Student> students, int age) {
  var filtered = students.Where(s => s.Age == age);
  ...
}
Run Code Online (Sandbox Code Playgroud)

Lambdas允许轻松捕获在委托表达式中使用的本地状态.手动执行此操作需要大量工作,因为您需要声明函数和包含类型以保持状态.例如,上面没有lambda

void Method(IEnumerable<Student> students, int age) {
  var c = new Closure() { Age = age };
  var filtered = students.Where(c.WhereDelegate);
  ...
}

class Closure {
  public int age;
  bool WhereDelegate(Student s) {
    return s.Age == age;
  }
}
Run Code Online (Sandbox Code Playgroud)

输入这个是乏味且容易出错的.Lambda表达式自动执行此过程.