【问题标题】:Why is Func<T> not called Meth<T>?为什么 Func<T> 不叫 Meth<T>?
【发布时间】:2013-12-18 09:55:50
【问题描述】:

我今天刚刚使用了Action&lt;T&gt;(),它是Func&lt;T&gt;() 的兄弟姐妹,这让我现在很不安:

Func&lt;T&gt;official docs 中是这样评论的:

封装一个没有参数的方法,返回一个值 TResult 参数指定的类型。

因为即使评论提到它是一种方法(在 C# 中名义上没有函数这样的东西,AFAIK),为什么 C# 的设计者不只是调用该构造 Meth&lt;T&gt;Method&lt;T&gt;?

可能是因为“Meth”的奇怪声音?但是方法呢,会很清楚吗?

【问题讨论】:

  • 有趣的问题,可能是由于 VB.Net 使用 Function 关键字的方法?你知道在 vb.Net 世界中,Method 表示为 Function

标签: c# methods naming


【解决方案1】:

我在这里将“方法”视为一种实现细节——而函数的数学概念很常见。 (你有多少次听说过委托被描述为“函数指针”?)

请注意,“函数”一词甚至出现在 C# 中 - 匿名方法和 lambda 表达式都是“匿名函数”。

当你想要一个函数时,你可以使用Func&lt;&gt;——返回一个值的东西,可能给定一些输入。您并不真正关心它是否有方法支持;这只是你可以调用的东西。

我想说Func&lt;&gt;文档 在这里有些欠缺,而不是名称的选择。 (然后是阻止 Func&lt;void&gt; 有效的类型系统,这会在许多情况下使事情变得更简单 - 但这是另一回事。)

【讨论】:

  • Func 会消除对 Action 的需要,不是吗?我想知道他们为什么不那样做。
  • 那你不能做 List 吗?
  • @Alex:是的,会的。这也意味着您不需要非通用的 Task 类型 - 只需使用 Task&lt;void&gt; 代替。
  • @Rob2211:是的,你会的——除非你可以指定一些非 void 类型的参数约束。会有很多事情需要考虑,但我认为会有很大的优势。
  • 嗯。是我还是这听起来像是 C# 之神有一天会赐给我们凡人的一个非常酷的功能?
【解决方案2】:

我认为反过来。一切都是函数,即使 void MethodName 是返回类型为 void 的函数。

【讨论】:

  • 这在此处并不适用,因为Func 系列不支持任何返回类型为 void 的类型。
  • 我认为关键是两者是同义词。那么为什么选择函数这个词而不是方法,当这个词方法是Func&lt;T&gt;代表的传统c#术语时。
  • 阅读了很多 Eric Lippert 的答案:D 我想这也许是提高代码可读性的设计选择。
  • @Alex 你能给 Eric 的答案提供一些链接吗?
  • @Marcel 我的意思是一般意义上的。他经常谈论设计过程以及团队如何解释 c# 的各种变化和特性。看看ericlippert.com我相信你会明白我的意思。
【解决方案3】:

我一直认为术语方法和功能是同一件事(根据我的一个 cmets)但是,这篇文章; Difference between a method and a function描述区别在哪里;

方法是一段代码,由相关联的名称调用 与一个对象。在大多数方面,它与函数相同,除了 有两个关键区别。

  • 它被隐式传递给调用它的对象
  • 它能够对包含在类中的数据进行操作(记住对象是类的实例 - 类是 定义,对象是该数据的一个实例)

我认为这是关键的区别; Func&lt;T&gt; 与对象无关,它只是一个功能性“代码”。 Func 本身就是一个对象的事实稍微有点混乱,但你明白了。

【讨论】:

  • 我一般同意您的引用,但实际上,我所做的是调用一个对象,该对象甚至可以访问远程数据库,如下所示:CreateReport(reportHandler, () =&gt; UseCases.Get&lt;MyUseCase&gt;().GetReportData()); 其中 Func 是调用获取数据。
【解决方案4】:

我认为它的灵感来自函数式编程。 Funcs 在整个 LINQ 中被大量用作“purely functional”方法,即为给定输入返回输出而没有任何可观察到的副作用的方法。

【讨论】:

  • 我认为函数的概念早于函数式编程的概念。
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
相关资源
最近更新 更多