我为一家技术公司工作,该公司比产品发货做更多的原型设计。我刚刚被问到C#和F#之间有什么区别,为什么MS会创建F#以及它会比C#更好。
我已经使用这种语言一段时间了,我喜欢它,所以我可以很容易地继续讨论F#的强大功能,但是我缺乏C#的经验来说明为什么我们应该使用它而不是另一种。
使用C#vs F#或F#vs C#有什么好处?
答案 0 :(得分:86)
函数式编程对命令式语言的一般好处:
您可以更容易地表达许多问题,更接近它们的定义,并且在F#等函数式编程语言中更简洁,并且您的代码不易出错(不变性,更强大的类型系统,直观的重复算法)。您可以编写您的意思而不是计算机要求您说的内容;-) 当您谷歌搜索或甚至在搜索它时,您会发现许多类似的讨论。
特殊F# - 优势:
使用async {}
-expressions,异步编程非常简单直观 - 即使使用ParallelFX,相应的C#代码也要大得多
Very easy integration编译器编译器和特定于域的语言
根据需要扩展语言:LOP
更灵活的语法
通常更短,更优雅的解决方案
C#的优势在于它通常比“命令式”应用程序(用户界面,命令式算法)更精确,而不是函数式编程语言,它使用的.NET-Framework是强制设计的,并且它更广泛。
此外,您可以在一个解决方案中同时使用F#和C#,因此您可以结合两种语言的优点并在需要的地方使用它们。
答案 1 :(得分:36)
这就像问一把锤子比螺丝刀有什么好处。在极高的水平上,两者基本上都是相同的,但在实施层面,为您要完成的任务选择最佳工具非常重要。在c#中有一些困难和耗时的任务,但在f#中很容易 - 就像试图用螺丝刀敲钉子一样。你可以做到这一点 - 当然这并不理想。
数据操作是我个人可以指出的一个例子,其中f#真正闪耀,而c#可能很笨拙。另一方面,我会说(一般来说)复杂的有状态UI在OO(c#)中比在函数(f#)中更容易。 (可能会有一些人不同意这一点,因为它现在很“酷”以“证明”在F#中做任何是多么容易,但我坚持这一点)。还有无数其他人。
答案 2 :(得分:27)
答案 3 :(得分:27)
按照我的理解回答你的问题:为什么要使用C#? (你说你已经在F#上卖了。)
首先关闭。这不仅仅是“功能与OO”。这是“功能+ OO与OO”。 C#的功能非常简陋。 F#不是。同时,F#几乎完成了C#的所有OO功能。在大多数情况下,F#最终成为C#功能的超集。
但是,有些情况下F#可能不是最佳选择:
互操作。有很多库不会对F#感到太舒服。也许他们利用某些C#OO,F#不会做同样的事情,或者他们可能依赖于C#编译器的内部。例如,表达式。虽然您可以轻松地将F#引用转换为表达式,但结果并不总是与C#完全相同。某些库存在此问题。
是的,互操作是一个非常大的网络,可能会导致与某些库的一些摩擦。
如果你有一个庞大的现有代码库,我认为interop也包括在内。刚开始用F#编写部件可能没有意义。
设计工具。 F#没有。并不意味着它不能拥有任何东西,但是现在你不能用F#codebehind来制作一个WinForms应用程序。即使在支持它的地方,例如在ASPX页面中,您也不会获得IntelliSense。因此,您需要仔细考虑生成代码的边界。在一个几乎完全使用各种设计师的非常小的项目中,使用F#作为“胶水”或逻辑可能是不值得的。在较大的项目中,这可能不再是一个问题。
这不是一个固有的问题。与Rex M的答案不同,我没有看到任何关于C#或F#的固有内容,这使得他们更好地使用大量可变字段来创建UI。也许他指的是必须编写“可变”并使用< - 而不是=的额外开销。
还取决于使用的库/设计器。我们喜欢将ASP.NET MVC与F#一起用于所有控制器,然后使用C#web项目来获得ASPX设计人员。我们在C#和F#之间混合了实际的ASPX“代码内联”,具体取决于我们在该页面上需要什么。 (IntelliSense与F#类型。)
其他工具。他们可能只是期待C#而不知道如何处理F#项目或编译代码。此外,F#的库不作为.NET的一部分提供,因此您需要额外发货。
但问题是头号问题?人。如果你的开发人员都没有想要学习F#,或者更糟糕的是,难以理解某些方面,那么你可能会敬酒。 (虽然,在这种情况下,我认为你无论如何都要干杯。)哦,如果管理层说不,那可能是个问题。
我刚才写过这篇文章:Why NOT F#?
答案 4 :(得分:6)
您要求对程序语言和功能语言进行比较,以便我在此处回答您的问题:What is the difference between procedural programming and functional programming?
至于MS创建F#的原因,答案很简单:创建一个可以访问.Net库的功能语言,只是扩大了它们的市场基础。看看语法与OCaml几乎完全相同,它实际上并不需要太多的努力。
答案 5 :(得分:5)
如果你把它与C#,C ++,VB进行比较,那么F#还不是另一种编程语言。 C#,C,VB都是命令式或过程式编程语言。 F#是一种函数式编程语言。
函数式编程语言的两个主要好处(与命令式语言相比)是1.它们没有副作用。这使得关于程序属性的数学推理变得更加容易。 2.职能是一等公民。您可以将函数作为参数传递给其他函数,就像其他值一样容易。
命令式和函数式编程语言都有其用途。虽然我还没有在F#中做过任何认真的工作,但我们目前正在我们的一个基于C#的产品中实现一个调度组件,并且将通过在F#中编写相同的调度程序来进行实验,以查看是否正确。与C#等价物相比,可以更容易地验证实现。
答案 6 :(得分:5)
F#本质上是函数式编程语言的C ++。他们保留了几乎所有来自Objective Caml的内容,包括非常愚蠢的部分,并将它放在.NET运行时的顶部,以便它从.NET中引入所有不好的东西。
例如,使用Objective Caml,您将获得一种类型的null,即< T>选项。使用F#,您将获得三种类型的null,选项< T>,Nullable< T>和引用空值。这意味着如果你有一个选项,你需要先检查它是否为“无”,然后你需要检查它是否是“Some(null)”。
F#就像旧的Java克隆J#,只是一种吸引注意力的混蛋语言。有些人会喜欢它,其中一些人甚至会喜欢它,但最后它仍然是一个20年前用于CLR的语言。
答案 7 :(得分:5)
我最喜欢.NET的一个方面是泛型。即使您在F#中编写过程代码,您仍然可以从类型推断中受益。它使编写通用代码变得容易。
在C#中,你默认编写具体的代码,你必须付出一些额外的工作来编写通用代码。
在F#中,您默认编写通用代码。在F#和C#中花了一年多的编程后,我发现用F#编写的库代码比我在C#中编写的代码更简洁,更通用,因此也更加可重用。我错过了在C#中编写通用代码的很多机会,可能是因为我被强制类型注释所蒙蔽。
然而,有些情况下使用C#是可取的,这取决于一个人的品味和编程风格。