1

为什么我们需要将一个函数作为参数传递给另一个函数。我想知道为什么我们不简单地在我们传递它的函数中调用该函数?

是因为参数函数的可访问性在被调用函数中受到限制?有人可以解释一下,当函数作为参数传递时在后台会发生什么,我们真的需要它在.NET 之类的框架中吗?

4

4 回答 4

4

将函数传递给函数或从函数返回函数的能力(即高阶函数)是整个编程范式(称为函数式编程)的基础。.NET 中的一个关键示例是 Linq,您可以在其中根据用户定义的函数有选择地操作集合。

例如,该Where函数允许您指定要如何过滤集合的元素。你可以用一行代码做到这一点:

var results = collection.Where(x => x.SomeProperty == someValue);

而如果您想在没有函数参数的情况下执行此操作,则每次您想要过滤、映射、减少集合等时都需要一个单独的函数。鉴于对集合的简单操作是一项非常常见的任务,这个在一个典型的项目中会产生更多的代码。

还有许多其他好处,例如指定要调用的函数而不实际调用它的能力——也称为惰性求值。这实际上是 Linq 内部的工作方式。在您尝试枚举结果集之前,上述行不会过滤结果。如果使用得当,这可以显着提高性能。

于 2013-07-29T06:12:24.623 回答
3

The advantage is that you can inject behavior into the method by calling the method with different methods as parameters. It's the same way you can call a regular method with different integer values. If you call it from within the function it's static and can't change. However if you take the method as a parameter you can pass whatever method you like as long as its return type and parameters meet the requirements.

于 2013-07-29T06:07:44.043 回答
1

最好的例子是http://en.wikipedia.org/wiki/Strategy_pattern

许多 Linq 方法都使用它。

( new List<int>() { 02, 15, 54, 61, 53, 84, 12 } ).All( i => { return i > 20; } );
于 2013-07-29T06:16:02.380 回答
1

函数可以是变量,因此可以在运行时计算。您声明一个变量并分配一个函数。稍后,您可以调用此函数,甚至可以在运行时更改。

.NET 语言从第一个版本开始就将它们视为一等公民。委托(C# 关键字delegate)是面向对象的函数指针。您可以在策略模式或所有类型的回调函数中使用函数指针。.NET 事件(关键字event)实现了观察者模式并用于所有 Windows 事件。

经常与 LINQ 结合使用的 Lambda 表达式(语法 =>)只是委托的一种特殊形式。编译器将它们转换为自 .NET 2.0 以来一直存在的匿名委托。

于 2013-07-29T16:13:24.337 回答