Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要包括Func/Func<;T>;作为参数?_C#_.net - Fatal编程技术网

C# 为什么要包括Func/Func<;T>;作为参数?

C# 为什么要包括Func/Func<;T>;作为参数?,c#,.net,C#,.net,我承认它们是有用的,但当我真的想要一个func作为方法的参数时,我正试图改变我的想法 public void WeirdMethod(int myNumber, func op); 在设计和功能方面,有人能向我解释一些我想考虑的情况吗?“可重用性”理论对我帮助不大。现实世界的场景最好。帮我像你一样思考,哈哈 以下是我所知道的一切: 这将允许我通过一个代表 这将允许我使用lambda表达式 是的 注: 我知道这个帖子会被关闭,因为没有“正确”的答案。但我想我刚才点击的是“延迟计算” 它们使您

我承认它们是有用的,但当我真的想要一个func作为方法的参数时,我正试图改变我的想法

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
    方法,该方法可能会写入控制台、调试窗口、日志文件、数据库或什么都不做。使用方法只知道它使用一个类型,并在需要时调用它

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

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


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


想想
在哪里
。您正在向一个函数提供一条逻辑(特别是满足您的条件的定义——不管它们是什么),该函数将其用作其执行的一部分。

?在这两种情况下,将函数作为值传递给函数或从函数返回函数的能力都是关键。代表们用C#为你们提供了这种机制。我不是反对者,但我没有投票,因为我觉得不懂
Func
的人也可能不懂
Curry
是什么意思,或者如何做
函数组合;没有(也不会)投反对票,但是我怀疑这个答案——虽然正确——对于这个问题的假定读者来说会有多大用处。如果您先阅读map reduce/函数式编程的这篇介绍性文章,这里给出的一些答案可能更有意义:我完全忘了认为函数在语义上等同于它们的返回值。谢谢谢谢你把lambda包括在内。有时,仅仅是在概念解释之后看到它就足够了。我并没有试图识别使用func的实例。我试图理解它们的用途,这样我就可以开始在我的实现代码中使用它们了。@Sin美学:你明白为什么它们被用于LINQ吗?是的,我经常使用它们。如果你明白为什么它们被用于LINQ,那么你问什么?你说“当我真的想要一个func作为一个方法的参数时,我正试图绕开它。”“当我真的想要一个func作为一个方法的*参数时,绕开它。”而不是“当我遇到一个func作为一个参数时,绕开它。”“。我想知道什么时候我会在自己的实现中使用它们。
Guid guid = GetFromCache(myKey, () => database.MakeNewGuid());