Mono 在定位我想要支持的平台方面做得更好。除此之外,一切都是主观的。
我在以下平台上共享 C# 代码: - iOS (iPhone/iPad) - Android - 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 视为 Microsoft 在 Windows 上的 Mono 实现。这意味着我首先在 Mono 上进行开发和测试。这非常有效。
如果 Java 和 .NET(比如说 Mono)都是没有任何公司支持的开源项目,那么我每次都会选择 Mono 而不是 Java。我相信这只是一个更好的平台。
.NET/Mono 和 JVM 都是不错的选择,尽管我个人会在 JVM 上使用 Java 以外的其他语言。
我对其他一些评论的看法:
问题:性能。
**答案:JVM 和 CLR 的性能都比批评者说的要好。我会说 JVM 性能更好。Mono 通常比 .NET 慢(尽管并非总是如此)。
无论是作为开发人员还是最终用户,我个人都会在任何一天都使用 ASP.NET MVC 而不是 J2EE。对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。如果您将 .NET 从 MS 与 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 实现了部分 CLR 规范,甚至 Microsoft 也不支持(如 64 位数组)。.NET 世界中最令人兴奋的新技术之一是Rosylyn。Mono 多年来一直将 C# 编译器作为服务提供。Rosylyn 提供的一些东西也可以通过NRefractory获得。Mono 仍然领先的一个例子是用于加速游戏性能的 SIMD 指令。
Microsoft 确实提供了许多基于 .NET 的产品,这些产品在 Mono 中不可用,这是对 Mono 滞后的误解的来源。Windows Presentation Foundation (WPF)、Entity Framework (EF)、WCF (Windows Communication Foundation) 是在 Mono 上无法运行或支持不佳的产品示例。显而易见的解决方案是使用 GTK#、NHibernate 和 ServiceStack 等跨平台替代方案。
问题:微软是邪恶的。
答:没错。所以呢。
许多人提出以下理由来避免使用 Mono:
1) 你不应该使用 Mono,因为应该避免使用 Microsoft 技术
2) Mono 很烂,因为它不允许你使用微软提供的所有技术
对我来说,很明显这些陈述是不相容的。我拒绝第一个陈述,但将在此处跳过该论点。第二个陈述适用于所有 .NET 替代方案。
JVM 是一个很棒的平台,JVM 语言的爆炸式增长令人惊叹。使用让你快乐的东西。目前,这对我来说通常是 .NET/Mono。