使用C#vs F#或F#vs C#有什么好处?[关闭]


93

我在一家技术公司工作,该公司的原型比产品交付还要多。我刚刚被问到C#和F#有什么区别,为什么MS创建F#,以及在什么情况下会比C#更好呢?

我使用该语言已有一段时间了,我很喜欢它,因此我可以轻松地继续学习F#的强大功能,但是我缺乏C#的经验来说明为什么我们应该在另一种语言上使用。

使用C#vs F#或F#vs C#有什么好处?


4
在我看来,关于SO的问题已经很多,至少可以部分回答您的问题。您是否尝试过使用“ [F#]关键字”而不是“ f#关键字”进行搜索?(例如,“ [f#]优势”)
Benjol,2009年

Answers:


86

函数式编程比命令性语言的一般优势:

您可以使用F#之类的功能编程语言轻松地编写许多问题,更接近它们的定义,并且更加简洁,并且您的代码不易出错(不变性,更强大的类型系统,直观的递归算法)。您可以编写您的意思而不是计算机想要说的内容;-) 在Google上搜索甚至在SO上搜索时,会发现许多类似的讨论。

F#的特殊优势:

看看这份文件

C#的优点在于,对于“命令式”应用程序(用户界面,命令式算法),它通常比功能性编程语言更准确;它所使用的.NET-Framework是强制性设计的,并且它的使用范围更广。

此外,您可以在一个解决方案中同时使用F#和C#,因此您可以将两种语言的优点结合起来,并在需要时使用它们。


16
它们以非常奇怪的方式结合在一起。例如,您可以在F#中重载>运算符。然后,C#开发人员可以使用它。但是,F#开发人员不能。没错,F#会发出它无法消耗的运算符重载。
乔纳森·艾伦,2009年

“此文档”链接已损坏...
Eduardo Brites 2013年

36

这就像问起锤子比起子有什么好处。在非常高的级别上,两者基本上都做同样的事情,但是在实现级别上,重要的是要为要完成的任务选择最佳工具。有些任务在c#中既困难又耗时,而在f#中则很容易-就像试图用螺丝刀砸钉子一样。您可以肯定地做到这一点-这并不理想。

数据处理是一个示例,我个人可以指出f#真正发挥作用的地方,而c#可能很笨拙。另一方面,我想说(一般而言),在OO(c#)中,复杂的有状态UI比功能(f#)更容易。(可能会有一些人不同意这一点,因为现在“证明” 在F#中执行任何操作是多么容易,这很“酷” ,但我坚持)。还有无数其他人。


22
如果您只有锤子,那么一切看起来都像钉子。-Maslow
查理·

20
我不会对此进行表决,因为除了一个数据示例外,它没有提供任何实际细节。我知道它们是不同的工具。我要问的是,这两种工具在相互比较方面最擅长和最差。我知道菲利普人通常是工作的最佳工具,即使较小的扁平头也会起作用。
gradbot

3
如果他不支持你,我会的。:P +1
Spencer Ruport 2009年

14
如果您只有锤子,一切似乎都像拇指。
Ed

6
我同意gradbot,这是一个很好的答案,因此我没有反对意见,但是它并没有真正涉及到原始问题的细节。这个答案只是一个模糊的概念解释,但确实错过了准确回答问题的意义。
Stan R. 2010年

27
  • 在数学方面,F#的性能优于C#
  • 您可以在与C#相同的解决方案中使用F#项目(并从另一个调用)
  • F#非常适合复杂的算法编程,财务和科学应用
  • F#逻辑上确实对并行执行有好处(使F#代码在并行内核上执行比C#容易)

6
关于F#在数学上比C#具有更好的性能:显然,事实并非如此。见thoughtfulcode.wordpress.com/2010/12/30/...
荷兰Joh

3
@Joh:inline是一个明显的例子,可以在C#中无法表达的F#中提供大量的性能改进。
JD

@Jon Harrop:我特别是指Rinat的博客条目。他获得F#的时机似乎是由于C#代码不够理想。
荷兰Joh

27

以我的理解来回答您的问题:为什么使用C#?(您说您已经在F#上出售了。)

首先。这不仅仅是“功能与面向对象”。这是“功能+ OO与OO”。C#的功能非常基本。F#不是。同时,F#几乎完成了C#的所有OO功能。在大多数情况下,F#最终是C#功能的超集。

但是,在某些情况下,F#可能不是最佳选择:

  • 互操作。有很多库对于F#来说并不太适合。也许他们利用了某些C#OO的功能,而F#却做不到这些,或者他们依赖C#编译器的内部。例如,表达式。尽管您可以轻松地将F#引号转换为表达式,但结果并不总是C#所要创建的。某些库对此有问题。

    • 是的,互操作性是一个很大的网络,可能会导致与某些库的冲突。

    • 如果您现有的代码库很大,我认为互操作也包括在内。只开始用F#编写零件可能没有意义。

  • 设计工具。F#没有任何东西。这并不意味着它没有任何内容,但是现在您不能用F#代码隐藏WinForms应用程序。即使在受支持的地方(如ASPX页面中),您当前也无法获得IntelliSense。因此,您需要仔细考虑生成代码的边界。在几乎只使用各种设计器的非常小的项目中,将F#用于“胶水”或逻辑可能不值得。在大型项目中,这可能不再是一个问题。

    • 这不是内在的问题。与Rex M的答案不同,我看不到C#或F#的任何内在特性,这些特性使它们更好地用于具有大量可变字段的UI。也许他指的是必须编写“可变”并使用<-而不是=的额外开销。

    • 还取决于所使用的库/设计器。我们喜欢对所有控制器使用带有F#的ASP.NET MVC,然后选择一个C#Web项目来获得ASPX设计器。我们根据页面上的需要在C#和F#之间混合实际的ASPX“代码内联”。(IntelliSense与F#类型。)

  • 其他工具。他们可能只希望使用C#,却不知道如何处理F#项目或已编译的代码。另外,F#的库不作为.NET的一部分提供,因此您还有一些额外的需要提供。

  • 但是排名第一的问题呢?人。如果您的开发人员都不希望学习F#,或更糟糕的是,在理解某些方面时遇到严重的困难,那么您可能会敬酒。(尽管如此,在这种情况下,我还是认为您还是要敬酒。)哦,如果管理层说不,那可能是个问题。

我前一阵子写道:为什么不使用F#?


6

您想要在过程语言和功能语言之间进行比较,因此我觉得您的问题可以在这里得到回答:过程编程和功能编程之间有什么区别?

关于MS创建F#的原因,答案很简单:创建可以访问.Net库的功能语言只会扩展其市场基础。并且看到语法与OCaml几乎一样,实际上并不需要太多的工作。


1
尽管我认为您的一般回答是正确的,真正的问题是关于编程范例而不是语言的比较,但我认为您所引用的问题的答案有点浅。
Jeroen Huinink 09年

如果您有更好的问题,请随时提出另一个问题。这是我从Google搜索中找到的最高评分。
斯潘塞·鲁波特

1
我认为他想对您说些好话,因为他说F#不需要Micrsoft付出很多努力。
Matthew Whited

+1表示市场基础评论。简单并且有一些道理。
gradbot

1
我不购买其他链接回答我的问题。C#支持较新版本中的许多功能构造。
gradbot

5

如果将F#与C#,C ++,VB进行比较,则它不是另一种编程语言。C#,C,VB都是命令性或过程性编程语言。F#是一种功能编程语言。

函数式编程语言(与命令式语言相比)的两个主要优点是:1.它们没有副作用。这使得关于程序属性的数学推理变得容易得多。2.职能是一等公民。您可以像将其他值一样轻松地将函数作为参数传递给另一个函数。

命令式和功能性编程语言都有其用途。尽管我还没有在F#中做任何认真的工作,但是我们目前正在基于C#的一种产品中实现一个调度组件,并且还将通过在F#中编码相同的调度器来进行实验,以查看F#的正确性。与等效的C#相比,可以更轻松地验证实现。


4
-1。F#是一种多范例(OO + FP)语言。只有函数式语言没有副作用(例如Haskell),但是F#并非纯函数。
Mauricio Scheffer'9

5

F#本质上是功能编程语言的C ++。他们保留了Objective Caml的几乎所有内容,包括真正愚蠢的部分,并将其放到.NET运行时之上,从而也吸收了.NET的所有不良影响。

例如,使用Objective Caml,您将获得一种null类型,即选项<T>。使用F#,您将获得三种类型的null,option <T>,Nullable <T>和引用null。这意味着,如果您有一个选项,则需要首先检查它是否为“ None”,然后需要检查它是否为“ Some(null)”。

F#就像旧的Java克隆J#,只是一种吸引眼球的混蛋。有些人会喜欢它,有些人甚至会使用它,但最终它仍然是20年历史的CLR语言。


2
+1,这也许是一个冷酷的事实,但是我仍然很高兴我可以在VS和.NET中使用功能语言
gradbot

1
我同意Nullable <T>应该让编译器为我们做一些魔术别名。我不确定使“ Some null”等于“ None”是否总是可行的-某些互操作代码可能会依赖它。但是引用为空?您将如何解决.NET中的一个主要漏洞?将每个引用类型都包装在选项中?实际上,在某些互操作方案中这似乎只是一个问题。
MichaelGG

12
FWIW,我从事F#的专业编程工作已经有好几年了(比世界上几乎任何人都更长),但我从未见过这个问题或Some null任何F#代码中的代码。在人们可能会担心的所有事情中,这一定要轻描淡写 ……
JD

1
将F#与C ++进行比较有点牵强。C ++的许多部分具有未定义或不清楚的语义,F#简单且定义明确。.NET运行时的质量无法与F#相提并论,因为任何.NET语言都存在相同的问题。
约翰

1
在超过2年的专业F#编程(如@Jon)中,我从未见过与“某些空值”相关的任何问题。另一方面,我从.Net框架的功能中受益匪浅。
Marc Sigrist 2012年

5

我最喜欢的.NET方面之一是泛型。即使您使用F#编写过程代码,您仍将从类型推断中受益。它使编写通用代码变得容易。

在C#中,默认情况下您编写具体的代码,并且必须付出一些额外的工作来编写通用代码。

在F#中,默认情况下编写通用代码。在用F#和C#进行了一年的编程之后,我发现用F#编写的库代码比用C#编写的代码既简洁又通用,因此也更可重用。我错过了许多用C#编写通用代码的机会,可能是因为我对强制类型注释视而不见。

但是,在某些情况下,根据个人的喜好和编程风格,最好使用C#。

  • C#不会在类型之间强加声明的顺序,并且对文件的编译顺序不敏感。
  • 由于类型推断,C#具有F#无法承担的一些隐式转换。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.