3

我承认它们可能很有用,但是当我实际上想要将 func 作为方法的参数时,我试图绕开我的脑袋。

public void WeirdMethod(int myNumber, func op);

在设计和功能方面,有人可以向我解释一些我想考虑这个的情况吗?“可重用性”理论对我没有多大帮助。现实世界的场景将是最好的。帮助我像你一样思考,哈哈。

以下是我所知道的一切:

  • 这将允许我通过一个代表
  • 这将允许我使用 lambda 表达式。

是的...

注意:我知道这个帖子会被关闭,因为没有“正确”的答案。但我认为刚才对我来说点击它的是“延迟计算”。

4

5 回答 5

4
  • 将操作推迟到以后。一个非常实际的例子是推迟更改跟踪,直到完全填充对象树。每种类型或存储库都可以告诉您它想要做什么,而调用者可以决定何时实际执行它。

  • 逻辑的组成(正如贾斯汀尼斯纳所提到的)。

  • 抽象,例如(“这是一个具有输入和输出的合同,但我不在乎它的实现是什么,只要它履行合同即可)。例如,您可以将“statusWriter”传递给Func可能写入的方法控制台、调试窗口、日志文件、数据库,或者什么都不做。所有消费方法都知道它消费一个类型并在需要时调用它。

  • 同样,将 a 传递Func给方法允许以一种抽象且简单的方式允许调用者定义where谓词。我经常使用这种范例来支持将强类型过滤器应用于结果(不是在谈论 LINQ to SQL,只是在调用者认为合适的时候过滤信息列表)。

  • 优雅的函数范式,例如这个例子,它演示了使用匿名函数的递归。如果无法将一个函数传递给另一个函数(尤其是缩写形式),这些构造将是冗长/不可能的。

于 2012-09-28T21:40:26.237 回答
3

一般情况是您必须将延迟计算传递给您的方法。这在计算某些东西很昂贵时很有用,例如,当您缓存某些东西时。

public Guid GetFromCache(string key, Func<Guid> make) {
    Guid res;
    if (!cache.TryGetValue(key, out res)) {
        res = make();
        cache.Add(key, res);
    }
    return res;
}

现在您可以按如下方式调用此方法:

Guid guid = GetFromCache(myKey, () => database.MakeNewGuid());
于 2012-09-28T21:31:57.677 回答
3

如果你有一些异步的东西,你想给它一个回调方法?

于 2012-09-28T21:32:26.287 回答
0

它们使您能够使用 Curry 函数以及使用函数组合。

于 2012-09-28T21:31:18.363 回答
0

虽然您之前几乎肯定使用过委托(因为这就是事件),但 LINQ 是一个很好的例子,当将委托作为函数参数传递时很有用。

想想Where。您正在为将其用作执行的一部分的函数提供一段逻辑(特别是满足您的标准的定义 - 无论它们是什么)。

于 2012-09-28T21:56:31.553 回答