Mono在针对我想要支持的平台方面做得更好。除此之外,这都是主观的。
我在以下平台上共享C#代码: - iOS (iPhone/iPad) - Android - The Web (HTML5) - Mac (OS X) - Linux - Windows
我可以分享更多的地方: - Windows Phone 7 - Wii - XBox - PS3 - 等等。
最大的问题是iOS,因为MonoTouch工作得非常好。我不知道有什么好的方法可以用Java来定位iOS。你不能用Java来定位Windows Phone 7,所以我想说Java更适合移动的日子已经过去了。
对我来说,最大的因素是个人生产力(和幸福感)。C#作为一种语言比Java领先多年,恕我直言,.NET框架使用起来很愉快。Java 7 和 Java 8 中添加的大部分内容已经在 C# 中使用多年。像Scala和Clojure这样的JVM语言(两者都可以在CLR上使用)非常好。
我认为Mono本身就是一个平台(一个伟大的平台),并将.NET视为Windows上Mono的Microsoft实现。这意味着我首先在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集成了我想要使用的大多数工具,包括代码完成(intellisense),Git /Subversion集成,对单元测试的支持,SQL集成,调试,轻松重构以及具有动态反编译的程序集浏览。将相同的环境用于从服务器端Web到移动应用程序的所有内容真是太好了。
问题:跨平台兼容性。
答:Mono 是跨所有平台(包括 Windows)的单一代码库。
首先为Mono开发,如果您愿意,可以部署到Windows上的.NET。如果你将.NET从MS比作Java,那么Java在跨平台的一致性方面具有优势。查看下一个答案...
问题:单色滞后 .NET。
答:不,它没有。恕我直言,这是一个经常陈述但不正确的陈述。
来自Xamarin的Mono发行版附带C#,VB.NET,F#,IronPython,IronRuby,我认为可能是Boo开箱即用。Mono C# 编译器与 MS 完全同步。Mono VB.NET 编译器确实滞后于 MS 版本。其他编译器在两个平台上都是相同的(其他.NET语言如Nemerle,Boo和Phalanger(PHP)也是如此)。
Mono 附带了许多实际的 Microsoft 编写代码,包括 Dynamic Language Runtime (DLR)、托管扩展性框架 (MEF)、F# 和 ASP.NET MVC。因为Razor不是开源的,所以Mono目前附带MVC2,但MVC3在Mono上工作得很好。
核心Mono平台已经与.NET保持同步或多年,兼容性令人印象深刻。现在,您可以使用完整的 C# 4.0 语言,甚至可以使用某些 C# 5.0 功能。事实上,Mono 经常在很多方面领先 .NET。
Mono实现了CLR规范中甚至微软都不支持的部分内容(如64位数组)。.NET世界中最令人兴奋的新技术之一是Rosylyn。Mono多年来一直将C#编译器作为服务提供。Rosylyn提供的一些内容也可以通过NRefractory获得。Mono仍然领先于前方的一个例子是SIMD指令,以加速游戏性能。
微软确实在.NET之上提供了许多产品,这些产品在Mono中不可用,这是对Mono滞后的误解。Windows Presentation Foundation (WPF)、Entity Framework (EF)、WCF (Windows Communication Foundation) 是在 Mono 上不起作用或受支持不力的产品示例。显而易见的解决方案是使用跨平台的替代方案,如GTK#,NHibernate和ServiceStack。
问题:微软是邪恶的。
答:是的。那又怎样。
许多人提供以下理由来避免使用Mono:
1)你不应该使用Mono,因为微软的技术应该避免
2)Mono很糟糕,因为它不让你使用微软提供的所有技术。
在我看来,这些说法显然是不相容的。我拒绝第一种说法,但在这里将跳过这个论点。第二种说法适用于所有 .NET 替代项。
JVM是一个很棒的平台,JVM语言的爆炸式增长非常棒。使用让你快乐的东西。目前,对我来说通常是.NET/Mono。