为什么我要包含一个Func / Func <t>作为参数?</t>

时间:2012-09-28 21:28:37

标签: c# .net

我承认它们可能很有用,但是当我真的希望将func作为方法的参数时,我正试图解决这个问题。

public void WeirdMethod(int myNumber, func op);

在设计和功能方面,有人可以向我解释一些我想要考虑的情况吗? “可重用性”的理论对我没有多大帮助。真实场景最好。帮我想想你好。

以下是我所知道的全部内容:

  • 这将允许我传递代理
  • 这将允许我使用lambda表达式。

Yeap ......

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

5 个答案:

答案 0 :(得分:4)

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

  • 逻辑构成(正如Justin Niessner所说)。

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

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

  • 优雅的功能范例,例如this example,它使用匿名函数演示递归。如果没有能够将一个函数传递给另一个函数(特别是缩写形式),这些结构将是冗长/不可能的。

答案 1 :(得分: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());

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

虽然您之前几乎肯定使用过委托(因为那是事件的内容),但LINQ是传递委托作为函数参数有用的一个主要示例。

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