Mono在定位我要支持的平台方面做得更好。除此之外,这都是主观的。
我在以下平台上共享C#代码:-iOS(iPhone / iPad)-安卓-Web(HTML5)-Mac(OS X)-Linux-Windows
我可以在更多地方分享它:-Windows Phone 7-Wii-XBox-PS3-等等。
最大的问题是iOS,因为MonoTouch可以出色地工作。我不知道使用Java定位iOS的任何好方法。您不能将Windows Phone 7与Java一起作为目标,因此我想说Java对移动技术更好的时代已经过去。
对我而言,最大的因素是个人生产力(和幸福感)。C#作为一种语言比Java IMHO领先多年,而.NET框架使用起来很令人愉悦。多年来,Java 7和Java 8中添加的大多数内容都已在C#中使用。不过,像Scala和Clojure这样的JVM语言(在CLR上都可用)非常好。
我将Mono视作一个平台(很好),并将.NET视为Microsoft在Windows上的Mono实现。这意味着我首先要在Mono上进行开发和测试。这很棒。
如果Java和.NET(比如说Mono)都是没有任何公司支持的开源项目,那么我每次都会选择Mono而不是Java。我相信这只是一个更好的平台。
.NET / Mono和JVM都是不错的选择,尽管我个人会在JVM上使用Java以外的其他语言。
我对其他一些评论表示赞同:
问题:性能。
**答案:JVM和CLR的性能都比批评者说的要好。我会说JVM性能更好。Mono通常比.NET慢(尽管并非总是如此)。
我个人将以开发人员和最终用户身份通过J2EE接受ASP.NET MVC。对Google Native Client的支持也很酷。另外,我知道台式Java应用程序的GUI性能差应该已经成为过去,但是我一直在寻找慢的应用程序。再说一次,我可以对WPF说同样的话。GTK#足够快,因此没有理由不必太慢。
问题:Java具有更大的可用库生态系统。
答:可能是正确的,但实际上这不是问题。
由于IKVM.NET,几乎每个Java库(包括JDK)都可以在.NET / Mono上运行。这是一项真正的奇迹。集成是惊人的。您可以像使用原生库一样使用Java库。我只需要在一个.NET应用程序中使用Java库。.NET / Mono生态系统通常提供超出我所需的功能。
问题:Java具有更好(更广泛)的工具支持
答:不在Windows上。否则我同意。MonoDevelop很好。
我要大声疾呼MonoDevelop;它是一颗宝石。MonoDevelop集成了我要使用的大多数工具,包括代码完成(智能),Git / Subversion集成,对单元测试的支持,SQL集成,调试,易于重构以及通过即时反编译进行的汇编浏览。对于从服务器端Web到移动应用程序的所有事物,都使用相同的环境真是太好了。
问题:跨平台的兼容性。
答:Mono是跨所有平台(包括Windows)的单个代码库。
首先为Mono开发,然后根据需要在Windows上部署到.NET。如果将MS的.NET与Java进行比较,则Java在跨平台的一致性方面具有优势。查看下一个答案...
问题:Mono落后于.NET。
答:不可以。恕我直言,这是一个经常陈述但不正确的陈述。
Xamarin的Mono发行版附带了C#,VB.NET,F#,IronPython,IronRuby,我想可能是Boo开箱即用。Mono C#编译器完全与MS保持同步。Mono VB.NET编译器确实落后于MS版本。其他编译器在这两个平台上都是相同的(与其他.NET语言(如Nemerle,Boo和Phalanger(PHP))相同)。
Mono附带了许多实际的Microsoft书面代码,包括动态语言运行时(DLR),托管扩展框架(MEF),F#和ASP.NET MVC。因为Razor不是开源的,所以Mono当前随MVC2一起提供,但是MVC3可以在Mono上正常工作。
核心Mono平台已与.NET保持同步或多年,并且兼容性令人印象深刻。您现在可以使用完整的C#4.0语言,甚至可以使用某些C#5.0功能。实际上,Mono通常以多种方式领导.NET。
Mono实现了甚至Microsoft都不支持的CLR规范的某些部分(例如64位数组)。Rosylyn是.NET世界中最激动人心的新技术之一。Mono已经将C#编译器作为服务提供了很多年。Rosylyn提供的一些产品也可以通过NRefractory获得。Mono仍然领先的一个例子是SIMD指令,以提高游戏性能。
微软确实在.NET之上提供了许多在Mono中不可用的产品,这是对Mono滞后的误解。Windows Presentation Foundation(WPF),实体框架(EF),WCF(Windows Communication Foundation)是在Mono上不起作用或支持不佳的产品的示例。显而易见的解决方案是使用跨平台替代方案,例如GTK#,NHibernate和ServiceStack。
问题:微软是邪恶的。
答:是的。所以呢。
许多人提供以下避免使用Mono的原因:
1)您不应使用Mono,因为应避免使用Microsoft技术
2)Mono很烂,因为它不能让您使用Microsoft提供的所有技术
对我来说,很明显这些语句是不兼容的。我拒绝第一条陈述,但在此将跳过该论点。第二个声明适用于所有.NET替代方案。
JVM是一个很棒的平台,并且JVM语言的爆炸性很棒。用什么让你快乐。就目前而言,对我来说通常是.NET / Mono。