【问题标题】:Advice on lambda expression [duplicate]关于 lambda 表达式的建议 [重复]
【发布时间】:2015-07-19 07:56:45
【问题描述】:

说我有这行代码:

Action<int> square = number => Console.WriteLine(number * number);

虽然我知道动态创建一个方法很方便,但如果您只需要调用一次 lamda 表达式,这样做是否会获得任何性能?

另外,假设我对WriteLine之前的值做了更多的事情:

Action<int> square = number =>   {
    number += 10;
    Console.WriteLine(number * number);
};

我可以通过将 10 添加到 number 来解决这个非常简单的问题,然后在没有 lambda 表达式的情况下执行 number * number。谁能给我一个很好的例子/什么时候使用这个表达式?

【问题讨论】:

  • "谁能给我一个很好的例子/情况什么时候使用这个表达式?" - 不,你的 lamda 表达式没有意义使用
  • 通常您创建方法来简化代码并为某些功能赋予一些有意义的名称。调用方法多少次都没有关系。创建内联方法总是使代码更复杂,更难理解和维护
  • 开发者大多倾向于使用Action委托作为异步范式的回调。
  • @JenishRabadiya 即使没有异步范式。
  • @BinkanSalaryman:啊哈。这种解释证实了我的重复投票:)(换句话说,这实际上是关于何时以及为什么使用方法指针,而不是以传统方式调用某些代码。)

标签: c# lambda


【解决方案1】:

想象一下:
您有要应用函数的值列表。您可以将此函数保存在 Action 中,然后在您的代码中应用此函数。 例如:

Predicate<int> isEven = number => number % 2 == 0;
List<int> numbers = Enumerable.Range(1,100);
var evenNumbers = numbers.Where(isEven);

这比 foreach 循环更具可重用性和可读性。

【讨论】:

    【解决方案2】:

    我知道,如果您只需要调用一次,那么使用 lambda 动态创建一个方法很方便,但这样做能获得任何性能吗?

    委托(例如Action&lt;T&gt; 的实例)是一级间接(非常类似于虚拟方法分派);当您调用委托时,运行时不仅仅执行方法内的代码;运行时首先必须找出它们引用的方法,然后调用该方法。

    代表们当然不会加快速度。但是你应该说明我们将它们与什么进行比较。

    话虽如此,除了最极端的情况外,委托调度的微小开销通常可以忽略不计; 不要太担心委托调用的性能

    Action<int> square = number => 
    {
        number += 10;
        Console.WriteLine(number * number);
    };
    

    谁能给我一个什么时候使用这个表达的好例子/情况?

    如果我能以另一种方式编写代码,我不会改变参数;当我们谈论 lambda 的参数时更是如此。相反,我会将参数派生的值放入(临时)局部变量中:

    Action<int> square = number => 
    {
        int n = number + 10;
        Console.WriteLine(n * n);
    };
    

    代码不再是真的,而且通常更容易理解,因为您不必担心您的 lambda 会意外更改传递给它的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多