C# 为什么要包括Func/Func<;T>;作为参数?
我承认它们是有用的,但当我真的想要一个func作为方法的参数时,我正试图改变我的想法C# 为什么要包括Func/Func<;T>;作为参数?,c#,.net,C#,.net,我承认它们是有用的,但当我真的想要一个func作为方法的参数时,我正试图改变我的想法 public void WeirdMethod(int myNumber, func op); 在设计和功能方面,有人能向我解释一些我想考虑的情况吗?“可重用性”理论对我帮助不大。现实世界的场景最好。帮我像你一样思考,哈哈 以下是我所知道的一切: 这将允许我通过一个代表 这将允许我使用lambda表达式 是的 注: 我知道这个帖子会被关闭,因为没有“正确”的答案。但我想我刚才点击的是“延迟计算” 它们使您
public void WeirdMethod(int myNumber, func op);
在设计和功能方面,有人能向我解释一些我想考虑的情况吗?“可重用性”理论对我帮助不大。现实世界的场景最好。帮我像你一样思考,哈哈
以下是我所知道的一切:
- 这将允许我通过一个代表
- 这将允许我使用lambda表达式
我知道这个帖子会被关闭,因为没有“正确”的答案。但我想我刚才点击的是“延迟计算” 它们使您既可以使用函数组合,也可以使用函数组合。一般情况下,您必须将延迟计算传递给您的方法。这在计算昂贵的内容时非常有用,例如,在缓存内容时
public Guid GetFromCache(string key, Func<Guid> make) {
Guid res;
if (!cache.TryGetValue(key, out res)) {
res = make();
cache.Add(key, res);
}
return res;
}
如果您有异步的东西,并且希望给它一个回调方法?
- 将操作推迟到稍后的时间。一个非常实用的例子是延迟更改跟踪,直到对象树完全填充。每种类型或存储库都可以告诉您它想要做什么,调用方可以决定何时实际做
- 逻辑的组成(如Justin Niessner所述)
- 抽象,例如(“这里有一个包含输入和输出的契约,但我不在乎它的实现是什么,只要它满足契约的要求就行了。)例如,您可以传递一个“statusWriter”“
方法,该方法可能会写入控制台、调试窗口、日志文件、数据库或什么都不做。使用方法只知道它使用一个类型,并在需要时调用它Func
- 同样,将
传递给方法允许调用方定义where谓词的一种抽象而简单的方法。我经常使用这个范例来支持应用于结果的强类型过滤器(不是说LINQ到SQL,只是在调用者认为合适时过滤信息列表)Func
- 优雅的函数范例,例如使用匿名函数演示递归。如果不能够将一个函数传递给另一个函数(尤其是以缩写形式),这些构造将是冗长/不可能的
想想
在哪里
。您正在向一个函数提供一条逻辑(特别是满足您的条件的定义——不管它们是什么),该函数将其用作其执行的一部分。?在这两种情况下,将函数作为值传递给函数或从函数返回函数的能力都是关键。代表们用C#为你们提供了这种机制。我不是反对者,但我没有投票,因为我觉得不懂Func
的人也可能不懂Curry
是什么意思,或者如何做函数组合;没有(也不会)投反对票,但是我怀疑这个答案——虽然正确——对于这个问题的假定读者来说会有多大用处。如果您先阅读map reduce/函数式编程的这篇介绍性文章,这里给出的一些答案可能更有意义:我完全忘了认为函数在语义上等同于它们的返回值。谢谢谢谢你把lambda包括在内。有时,仅仅是在概念解释之后看到它就足够了。我并没有试图识别使用func的实例。我试图理解它们的用途,这样我就可以开始在我的实现代码中使用它们了。@Sin美学:你明白为什么它们被用于LINQ吗?是的,我经常使用它们。如果你明白为什么它们被用于LINQ,那么你问什么?你说“当我真的想要一个func作为一个方法的参数时,我正试图绕开它。”“当我真的想要一个func作为一个方法的*参数时,绕开它。”而不是“当我遇到一个func作为一个参数时,绕开它。”“。我想知道什么时候我会在自己的实现中使用它们。
Guid guid = GetFromCache(myKey, () => database.MakeNewGuid());