为什么我们需要将一个函数作为参数传递给另一个函数。我想知道为什么我们不简单地在我们传递它的函数中调用该函数?
是因为参数函数的可访问性在被调用函数中受到限制?有人可以解释一下,当函数作为参数传递时在后台会发生什么,我们真的需要它在.NET 之类的框架中吗?
将函数传递给函数或从函数返回函数的能力(即高阶函数)是整个编程范式(称为函数式编程)的基础。.NET 中的一个关键示例是 Linq,您可以在其中根据用户定义的函数有选择地操作集合。
例如,该Where
函数允许您指定要如何过滤集合的元素。你可以用一行代码做到这一点:
var results = collection.Where(x => x.SomeProperty == someValue);
而如果您想在没有函数参数的情况下执行此操作,则每次您想要过滤、映射、减少集合等时都需要一个单独的函数。鉴于对集合的简单操作是一项非常常见的任务,这个在一个典型的项目中会产生更多的代码。
还有许多其他好处,例如指定要调用的函数而不实际调用它的能力——也称为惰性求值。这实际上是 Linq 内部的工作方式。在您尝试枚举结果集之前,上述行不会过滤结果。如果使用得当,这可以显着提高性能。
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.
最好的例子是http://en.wikipedia.org/wiki/Strategy_pattern
许多 Linq 方法都使用它。
( new List<int>() { 02, 15, 54, 61, 53, 84, 12 } ).All( i => { return i > 20; } );
函数可以是变量,因此可以在运行时计算。您声明一个变量并分配一个函数。稍后,您可以调用此函数,甚至可以在运行时更改。
.NET 语言从第一个版本开始就将它们视为一等公民。委托(C# 关键字delegate
)是面向对象的函数指针。您可以在策略模式或所有类型的回调函数中使用函数指针。.NET 事件(关键字event
)实现了观察者模式并用于所有 Windows 事件。
经常与 LINQ 结合使用的 Lambda 表达式(语法 =>)只是委托的一种特殊形式。编译器将它们转换为自 .NET 2.0 以来一直存在的匿名委托。