Lambda表达式的语句体

  在前面的所有代码中,Lambda表达式的语句体都只使用了一个表达式。我们还说明了这个表达式如何解释为Lambda表达式的返回值,例如,如何给返回类型为int的委托使用表达式 paramA + paramB 作为Lambda表达式的语句体(假定paramA和paramB隐式或显式类型化为int值,如示例代码所示)。

  前面的一个示例说明了对于语句体中使用的代码而言,返回类型为void的委托的要求并不高:

  1. myTimer.Elapsed += (source, e) => Console.WriteLine(
  2. "Event handler called after {0} millisenconds.",
  3. (source as Timer).Interval);

  上面的语句不返回任何值,所以它只是执行,其返回值不在任何地方使用。

  可以将Lambda表达式看成匿名方法语法的扩展,所以还可以在Lambda表达式的语句体中包含多个语句。为此,只需把一个代码块放在花括号中,类似于C#中提供多行代码的其他情况:

  1. (paramA, param2) =>
  2. {
  3. // Multiple statements ahoy!
  4. }

  如果使用Lambda表达式和返回类型不是void的委托类型,就必须用return关键字返回一个值,这与其他方法一样:

  1. (param1, param2) =>
  2. {
  3. // Multiple statements ahoy!
  4. return returnValue;
  5. }

  例如,可将前面示例中的如下代码:

  1. PerformOperations((paramA, paramB) => paramA + paramB);

  改写为:

  1. PerformOperations(delegate(int paramA, int paramB)
  2. {
  3. return paramA + paramB;
  4. });

  另外,也可以把代码改写为:

  1. PerformOperations((paramA, paramB) =>
  2. {
  3. return paramA + paramB;
  4. });

  这更像是原来的代码,因为它保持了paramA和paramB参数的隐式类型化。

  大多数情况下,在使用单一的表达式时,Lambda表达式最有用,也最简洁。说实话,如果需要多个语句,则定义一个单独的非匿名方法来替代Lambda表达式较好,这也会使代码更便于重用。