【问题标题】:when to use or not Lambda Expressions何时使用或不使用 Lambda 表达式
【发布时间】:2009-11-11 01:46:39
【问题描述】:

我看到 lambda 表达式在语言的某些方面已经成为一个非常有用的工具。我一直在使用它们,大多数时候它们非常适合并且使代码更短,也许更清晰。

现在.. 我见过一些,我会说过度使用它们。有些人非常喜欢它们,以至于试图在任何地方使用它们。有时 C# 代码看起来像一种函数式语言。

其他不利因素是使用 lambda 反射的成本以及对调试不友好。

我想听听关于使用或多或少的 lambda 表达式的好处和代码清晰程度的意见。

(这不是更好的例子,但假设它是触发器)

我正在编写以下代码。使用delegate { return null; } 可以帮助我避免每次必须使用它时都询问事件是否为空。

public delegate ContactCellInfo.Guest AddGuest();
public event AddGuest GuestRequest = delegate { return null;}

我正在使用 resharper 和明智的 resharper(即使有时它确实会吃掉内存)给了我以下建议

public delegate ContactCellInfo.Guest AddGuest();
public event AddGuest GuestRequest = () => null;

在我看来,使用委托的代码看起来更清晰。我并不反对 lamdba 表达,只是想听听一些关于如何以及何时使用它们的建议。

【问题讨论】:

  • 提示:您不必从您的委托人那里返回 null。一个空的委托就可以了。
  • “使用 lambda 反射的成本”:没有成本。您代码中的 lambda 完全 等效于匿名方法。 (Lambda 也可以用作 LINQ 意义上的表达式;但在这种情况下没有比较的意义,因为匿名方法不能用作表达式。)
  • 我使用空委托,但在这种情况下,它会给出错误“并非所有代码路径都在匿名方法中返回值...”
  • “其他不利因素是使用 lambda 反射的成本以及对调试不友好的成本。”你能解释一下你的意思吗?
  • @itowlson 我知道在这种情况下使用反射是没有成本的,我说的是它们的一般用途。

标签: c# .net vb.net delegates lambda


【解决方案1】:

这里有两个问题。

首先,对于您的示例,使用 lambda 与使用匿名委托语法。编译器生成的代码将是相同的,因此它不会归结为性能差异,而是可读性差异。

就我个人而言,我发现 lambda 语法很容易理解。我发现 lambda 语法几乎总是比匿名委托语法更干净、更简洁、更易于理解,所以我几乎总是更喜欢它。

至于在整个代码中使用 lambda 表达式 - 就我个人而言,我是他们的重度用户。我发现它们通常比定义许多方法更容易。如果一段代码不会被任何其他方法重用(它只会被调用并存在于一个地方),我将使用 lambda 来表达它。

如果一段代码将被多次使用,则应将其提取到(非匿名)方法中。另外,如果一段代码可以而且应该被测试,我倾向于为它创建一个方法,因为这样可以简化可测试性。

【讨论】:

  • 这是一个很好的回应。作为一名初级开发人员,它为我澄清了一些关于何时最适合使用 Lambda 的问题。
  • 我正在考虑一个适合使用 lambda 的时间。例如,昨天我添加了一个我知道只会在 1 个实例中使用的函数 A(从函数 B 调用)。如果我使用 lambda 函数而不是定义函数 A,我觉得函数 B 会太长,并且我会在另一个函数调用 (->lambda) 之后嵌套 lambda 函数。我在网上看到的所有示例都很琐碎,并且似乎更好地由函数定义。有没有人真正相信 lambda 更好的例子?
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多