Lambda表达式的性能优势

3

我对C#中的Lambda表达式还比较陌生,因为不知道除了减少代码量之外还有什么好处,所以很少使用它们。它们在某些/所有情况下是否更有效率?或者它们能够实现超越将更多代码放在一行内的fantastic things吗?


看看LINQ和延迟执行。 - SLaks
1
@SLaks,您是否认为延迟执行与Lambda表达式直接相关?我认为这主要是一个独立的问题... - Reed Copsey
@Peter,说得好。我的意思是针对类似情况的通用方法;老实说,我不确定该如何恰当地表达这个意思。我想说:“在什么情况下它们足够高效,以性能为基础来证明它们的使用是合理的?”可能更好一些? - Nashibukasan
2
Lambda表达式只是另一种编写匿名方法的语法。编译器会创建真正的方法并简单地执行它们。从执行的角度来看,它们并不比编写自己的方法并创建委托更有效率。 - Peter Ritchie
2个回答

10

它们在某些/所有情况下更有效吗?

总的来说,Lambda表达式并不是关于性能效率,而是关于开发者效率。

它们是一种比手动编写方法更高效的创建方法的方式。尽管如此,它们无法(直接)提高性能。

然而,通过正确地利用以函数方式工作的框架(例如:使用LINQ),您可以增加编写高效代码的可能性,因为该框架本身很可能进行了高度优化。


5

Lambda表达式并不是更高效的,它们只是更简单。它们主要用于:

  • 创建委托
  • 为LINQ创建表达式
  • 将本地变量放入委托的捕获中

当创建一个委托时,编译器创建的代码就像您创建了一个命名方法,并获得了该方法的委托一样。

Func<int, int> mul = n => n * 2;

相比之下:

public static int Mul(int n) {
  return n * 2;
}

Func<int, int> = Mul;

创建表达式时,编译器会生成一个表达式树,可以将其转换为委托或由LINQ提供程序用于转换为其他内容。例如,Linq To Sql提供程序会将表达式转换为SQL代码。
创建使用在创建委托的方法中声明的局部变量的委托时,会自动创建闭包对象,该对象位于变量所在的位置,而不是将变量放在堆栈上。这类似于通过将其作为类中字段使变量可用于命名方法的方式。
int x = 2;
Func<int, int> mul = n => n * x;

相较于:

public class Closure {

  public int x;

  public int Mul(int n) {
    return n * x;
  }

}

Closure c = new Closure;
c.x = 2;

Func<int, int> mul = x.Mul;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接