C# 为什么Func<;T>;不称为冰毒<;T>;?

C# 为什么Func<;T>;不称为冰毒<;T>;?,c#,methods,naming,C#,Methods,Naming,我刚刚使用了Action(),今天它是兄弟Func(),这让我现在心神不宁: Func的注释如下: 封装一个没有参数且返回值为的方法 TResult参数指定的类型 因为即使是评论也提到了这是一种方法(在C中,默认情况下没有函数这类东西,为什么C的设计者不只是称之为构造 方法或方法? 是不是因为“冰毒”的奇怪声音?但是关于方法,这将是非常清楚的吗?我认为它是另一种方式。一切都是一个函数,即使void MethodName是一个具有void返回类型的函数。我认为它的灵感来自函数编程Funcs在整个L

我刚刚使用了
Action()
,今天它是兄弟
Func()
,这让我现在心神不宁:

Func
的注释如下:

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

因为即使是评论也提到了这是一种方法(在C中,默认情况下没有函数这类东西,为什么C的设计者不只是称之为构造
方法
方法


是不是因为“冰毒”的奇怪声音?但是关于方法,这将是非常清楚的吗?

我认为它是另一种方式。一切都是一个函数,即使void MethodName是一个具有void返回类型的函数。

我认为它的灵感来自函数编程
Func
s在整个LINQ中被大量用作“”方法,也就是说,返回给定输入的输出而没有任何可观察的副作用的方法。

我认为“方法”在这里是一种实现细节,而函数的数学概念是常见的。(您多久听说一次委托被描述为“函数指针”?)

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

当您想要一个函数时,可以使用
Func
——返回值的函数,可能给定一些输入。你并不在乎它是否有方法支持;你可以打电话给我


我想说的是,这里缺少的是
Func
的文档,而不是名称的选择。(还有防止
Func
有效的类型系统,这在许多情况下会使事情变得简单很多,但那是另一回事。)

我一直认为术语方法和函数是同一件事(根据我的一条评论),然而,这篇文章;描述其中的差异

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

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

我认为这是关键的区别
Func
与对象无关,它只是一段功能性的“代码”。事实上,
Func
本身就是一个对象,这会稍微弄乱一些事情,但是你会得到一般的想法。

有趣的问题,是不是因为VB.Net使用Function关键字作为方法?您知道,在vb.Net世界中,方法被表示为函数,但在这里并不真正起作用,因为
Func
系列不支持任何具有空返回类型的类型。我认为关键是这两者是同义的。那么为什么选择“功能”这个词而不是“方法”,当单词method是
Func
所代表内容的传统c#术语时。读了很多Eric Lippert的答案后:D我想这可能是一个提高代码可读性的设计选择。@Alex你能给Eric的答案提供一些链接吗?@Marcel我的意思是一般意义上的。他经常谈论设计过程,以及团队如何解释c#的各种变化和特性。看一看,我相信你会明白我的意思。我认为函数的概念早于函数编程的概念。Func将不再需要采取行动,不是吗?我想知道他们为什么不那样做。那你就不能做列表了吗?@Alex:是的,会的。这也意味着您不需要非泛型的
任务
类型-只需使用
任务
即可。@Rob2211:是的,您需要-除非您可以指定一些非无效类型的参数约束。会有很多事情需要考虑,但我认为会有很大的优势。是我还是这听起来像是一个很酷的特性,C#之神总有一天会赐予我们这些凡人?我大体上同意你的引用,但实际上,我所做的是调用一个甚至可以访问远程数据库的对象:
CreateReport(reportHandler,()=>UseCases.Get().GetReportData())其中Func是获取数据的调用。