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

我为一家技术公司工作,该公司比产品发货做更多的原型。 我刚刚被问到C#和F#之间有什么区别,为什么MS创buildF#和什么情况会比C#更好。

我已经使用了一段时间的语言,我喜欢它,所以我可以轻松地继续关于F#的伟大function,但是我缺乏C#的经验来说明为什么我们应该使用它。

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

函数式编程对命令式语言的一般好处:

您可以更容易地制定许多问题,更接近他们的定义,并在F#等函数式编程语言中更简洁,而且您的代码不太容易出错(不变性,更强大的types系统,直观的循环algorithm)。 你可以编码你的意思,而不是计算机要你说什么;-) 你会发现很多像这样的讨论,当你谷歌,甚至search它在SO。

特别的F# – 优点:

  • 使用async {}expression式asynchronous编程非常简单直观 – 即使使用ParallelFX,相应的C#代码也要大得多

  • 编译器编译器和领域特定语言的非常容易的集成

  • 根据需要扩展语言: LOP

  • 测量的单位

  • 语法更灵活

  • 通常更短,更优雅的解决scheme

看看这个文件

C#的优点在于它比function性编程语言对于“命令式”应用程序(用户界面,命令式algorithm)通常更准确,它所使用的.NET框架的devise势在必行,而且更为广泛。

此外,您可以将F#和C#集中在一个解决scheme中,这样就可以将两种语言的优点结合起来,并在需要的地方使用它们。

就像问一个锤子在螺丝刀上的好处是什么一样。 在一个非常高的层次上,两者都做同样的事情,但是在实现层面上,select最适合你要实现的工具是非常重要的。 有些任务在c#中很困难和耗时,但在f#中很容易 – 就像试图用螺丝刀敲打钉子一样。 你可以这样做,肯定 – 这不是很理想。

数据操作就是我可以亲自指出f#真正闪耀的一个例子,c#可能很笨拙。 另一方面,我认为(一般来说)复杂的有状态UI在OO(c#)中比function性(f#)更容易。 (可能有些人不同意这一点,因为现在“很酷”,以“certificate”在F#中做任何事情是多么的容易,但我支持它)。 还有无数其他人。

  • 在math中F#比C#有更好的性能
  • 您可以在C#中使用相同的解决scheme中的F#项目(并从一个到另一个)
  • F#对于复杂的algorithm编程,财务和科学应用程序非常有用
  • F#在逻辑上对于并行执行是非常有利的(在C#上并行执行F#代码更容易)

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

首先, 这不仅仅是“function性与面向对象”。 这是“function+ OO与OO”。 C#的function特性相当简单。 F#不是。 同时,F#几乎可以完成C#的所有OOfunction。 在大多数情况下,F#最终成为C#function的超集。

但是,有些情况下F#可能不是最好的select:

  • 互操作。 F#中有许多库不会太舒服。 也许他们利用某些C#OO事情,F#不这样做,或者他们可能依赖于C#编译器的内部。 例如,Expression。 虽然您可以轻松地将F#语句转换为expression式,但结果并不总是C#会创build的。 某些图书馆有这个问题。

    • 是的,interop是一个相当大的networking,可能会导致一些图书馆的一些摩擦。

    • 我认为互操作也包括如果你有一个大的现有代码库。 在F#中开始编写部件可能没有意义。

  • devise工具。 F#没有任何 并不意味着它没有任何,但现在你不能用F#代码隐藏起来WinForms应用程序。 即使在支持的地方,就像ASPX页面一样,你目前还没有得到IntelliSense。 所以,你需要仔细考虑你的边界将生成的代码。 在一个几乎完全使用各种devise师的非常小的项目中,将F#用于“粘合”或逻辑可能不值得。 在较大的项目上,这可能会变成一个问题。

    • 这不是一个内在的问题。 与Rex M的回答不同,我没有看到C#或F#内在的东西,使他们更好地做一个有很多可变字段的UI。 也许他指的是不得不编写“可变”和使用< – 而不是=的额外开销。

    • 还取决于使用的图书馆/devise师。 我们喜欢使用ASP.NET MVC和F#来控制所有的控制器,然后使用C#web项目来获取ASPXdevise器。 我们在C#和F#之间混合实际的ASPX“内联代码”,具体取决于我们在该页面上需要的内容。 (智能感知与F#types。)

  • 其他工具。 他们可能只是期待C#而不知道如何处理F#项目或编译的代码。 此外,F#的库不作为.NET的一部分,所以你有一些额外的运输。

  • 但是头号问题呢? 人。 如果您的开发人员都不想学习F#,或者更糟糕的是,在理解某些方面时有困难,那么您可能会敬酒。 (尽pipe如此,在这种情况下,我认为你要干杯)哦,如果pipe理层说不,那可能是个问题。

我前一阵子写了: 为什么不是F#?

你要求在过程语言和function语言之间进行比较,所以我觉得你的问题可以在这里得到解答: 过程式编程和函数式编程有什么区别?

至于为什么MS创buildF#的答案很简单:创build一个访问.Net库的函数式语言只是扩大了他们的市场基础。 看看这个语法和OCaml几乎是一样的,但它们确实不需要太多的努力。

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

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

命令式和函数式编程语言都有其用途。 虽然我还没有在F#上做过任何认真的工作,但是我们目前正在基于C#的产品之一中实现一个调度组件,并且将通过在F#中编写相同的调度程序来做一个实验,看看这个调度的正确性实现可以比C#等价物更容易validation。

F#本质上是函数式编程语言的C ++。 他们保留了Objective Caml几乎所有的东西,包括那些非常愚蠢的部分,并且把它放在.NET运行时的顶部,这样它也会从.NET中引入所有不好的东西。

例如,使用Objective Cam,你可以得到一个nulltypes的选项<T>。 使用F#可以得到三种types的null,选项<T>,Nullable <T>和参考零点。 这意味着如果你有一个选项,你需要首先检查是否是“无”,那么你需要检查它是否是“一些(空)”。

F#就像旧的Java克隆J#一样,只是一个混杂的语言,只是为了吸引注意力。 有些人会喜欢它,其中一些人甚至会用它,但最后还是一个20年前的CLR语言。

我最喜欢的.NET的一个方面是generics。 即使你用F#编写程序代码,你仍然可以从types推断中受益。 它使编写通用代码变得简单。

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

在F#中,默认情况下编写通用代码。 在花了一年多的时间在F#和C#编程之后,我发现用F#编写的库代码比我在C#中编写的代码更简洁,更通用,因此也更易于重用。 我错过了很多使用C#编写generics代码的机会,可能是因为我被强制types注释所蒙蔽了。

不过,根据个人的喜好和编程风格,使用C#更好。

  • C#不在types之间强加一个声明的顺序,它对编译文件的顺序不敏感。
  • C#有一些F#因types推断而无法承受的隐式转换。