我承认它们可能很有用,但是当我真的希望将func作为方法的参数时,我正试图解决这个问题。
public void WeirdMethod(int myNumber, func op);
在设计和功能方面,有人可以向我解释一些我想要考虑的情况吗? “可重用性”的理论对我没有多大帮助。真实场景最好。帮我想想你好。
以下是我所知道的全部内容:
Yeap ......
注意: 我知道这个帖子会被关闭,因为没有“正确”的答案。但我认为刚才为我点击它的是“延迟计算”。
答案 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
。您将一个逻辑(特别是满足您的标准的定义 - 无论它们是什么)提供给将其用作执行的一部分的函数。