.NET / Mono或Java是跨平台开发的更好选择吗? [关闭]

问题

Mono的库比Java少了多少?

我缺乏对两种选择的概述,但我对下一个项目有很大的选择自由。我正在寻找有关技术领域的经验

  • 性能(例如,我被告知Java有利于线程化,我听说运行时代码优化最近已经变得非常好用于.NET)
  • 真实世界的便携性(它既可以携带,也可以是Catch-22?)
  • 工具可用性(CI,构建自动化,调试,IDE)

我特别关注你在自己的工作中经历的事情,而不是我可以google的事情。我的应用程序将是一个后端服务处理来自时间序列的大量数据。

我的主要目标平台是Linux。

**编辑:**要更充分地说出我的问题,我对整个包(第三方库等)感兴趣,而不仅仅是语言。对于图书馆来说,这可能归结为"Mono比Java更少的库"这个问题?

仅供参考,我已经为这个项目选择了Java,因为它似乎在可移植性方面更具战斗性,并且它在旧系统上已经存在了一段时间。我对此感到有点难过,因为我对C#很好奇,我很乐意在其中做一些大型项目,但也许下次。感谢所有的建议。


#1 热门回答(110 赞)

Mono在定位我想支持的平台方面做得更好。除此之外,这都是主观的。

我在以下平台上共享C#代码: - iOS(iPhone / iPad) - Android - Web(HTML5) - Mac(OS X) - Linux - Windows

我可以分享更多的地方: - Windows Phone 7 - Wii - XBox - PS3 - 等

这个biggie是iOS自MonoTouch以来的奇妙之处。我不知道用Java定位iOS有什么好办法。你不能用Java定位Windows Phone 7,所以我想说Java对于移动设备更好的日子已经过去了。

对我而言,最重要的因素是个人生产力(和幸福感)。 C#作为一种语言比Java IMHO领先多年,.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慢(但并不总是如此)。

作为开发人员和最终用户,我个人每天都会将ASP.NET MVC作为J2EE。支持Google Native Client也很酷。此外,我知道桌面Java应用程序的GUI性能不佳应该是过去的事情,但我一直在寻找缓慢的。再说一遍,我可以对WPF说同样的话。 GTK#速度很快,所以没有理由他们必须慢。
**问题:Java拥有更大的库生态系统。**答案:可能是真的,但在实践中却不是问题。
实际上,由于IKVM.NET,每个Java库(包括JDK)都在.NET / Mono上运行。这项技术是一个真正的奇迹。整合是惊人的;你可以像使用原生Java一样使用Java库。我只需要在一个.NET应用程序中使用Java库。 .NET / Mono生态系统通常提供的不仅仅是我需要的。
问题:Java有更好(更广泛)的工具支持****答案:不在Windows上。否则我同意。 MonoDevelop很不错。
我想大喊大叫MonoDevelop;它是一颗宝石。 MonoDevelop集成了我想要使用的大多数工具,包括代码完成(intellisense),Git / Subversion集成,对单元测试的支持,SQL集成,调试,轻松重构以及使用即时反编译的程序集浏览。从服务器端Web到移动应用程序,可以使用相同的环境。
**问题:跨平台的兼容性。**答案:Mono是包含Windows在内的所有平台的单一代码库。
如果你愿意,首先开发Mono并在Windows上部署到.NET。如果将.NET从MS与Java进行比较,那么Java在跨平台的一致性方面具有优势。看下一个答案......
问题:Mono滞后于.NET。
**答案:不,不。**IMHO,这是一个经常陈述但不正确的陈述。

来自Xamarin的Mono发行版附带了C#,VB.NET,F#,IronPython,IronRuby,我认为Boo可能是开箱即用的。 Mono C#编译器与MS完全一致。 Mono VB.NET编译器确实落后于MS版本。其他编译器在两个平台上都是相同的(与Nemerle,Boo和Phalanger(PHP)等其他.NET语言一样)。

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规范,甚至微软也不支持(如64位数组)。 .NET世界中最令人兴奋的新技术之一是Rosylyn。 Mono多年来一直将C#编译器作为服务提供。 Rosylyn提供的一些产品也可通过NRefractory获得。 Mono仍然领先的一个例子是加速游戏性能的SIMD指令。

微软确实提供了许多基于.NET的产品,这些产品在Mono中是不可用的,这是对Mono lagging的误解。 Windows Presentation Foundation(WPF),实体框架(EF),WCF(Windows Communication Foundation)是Mono上不起作用或支持不佳的产品示例。显而易见的解决方案是使用GTK#,NHibernate和ServiceStack等跨平台替代方案。
**问题:微软是邪恶的。**答案:是的。所以呢。
许多人提供以下原因以避免使用Mono:

1)你不应该使用Mono,因为应该避免使用Microsoft技术

2)Mono很糟糕,因为它不允许你使用微软提供的所有技术

对我而言,很明显这些陈述是不相容的。我拒绝第一个声明,但会在这里跳过这个论点。所有.NET替代品都是第二种说法。

JVM是一个很棒的平台,JVM语言的爆炸式增长非常棒。用什么让你开心。现在,对我来说,这通常是.NET / Mono。


#2 热门回答(94 赞)

嗯...... Java实际上更便携。 Mono并未在任何地方实施,并且显着落后于Microsoft实施。 Java SDK似乎可以跨平台保持更好的同步(并且它可以在更多平台上运行)。

我还说Java在所有这些平台上都有更多的工具可用性,尽管在Windows平台上有很多可用于.NET的工具。
2014年更新
我仍然在2014年持有这个观点。但是,我会说这是因为我刚刚开始关注Mono很长一段时间没有真正关心,所以Mono运行时(或生态系统)可能有所改进)我没有意识到。 AFAIK,仍然不支持WIF的WPF,WCF,WF。 Mono可以在iOS上运行,但据我所知,Java运行时仍然运行在比Mono更多的平台上。此外,Mono开始看到一些改进的工具(Xamarin),微软似乎有更多的跨平台态度和愿意与合作伙伴合作,使他们互补,而不是竞争(例如,Mono将是即将推出的OWIN / Helios ASP.NET环境中非常重要的一部分。我怀疑在未来几年中,可移植性的差异将迅速减少,特别是在.NET开源之后。
2018更新
我对此的看法开始走向另一条道路。我认为.NET,特别是.NET Core,已经开始实现与Java的"可移植性平等"。正在努力为某些平台将WPF引入.NET Core,而.NET Core本身现在可以在很多平台上运行。 Mono(由Xamarin拥有,现在由微软拥有)是一个比以往更成熟和更完美的产品,编写在多个平台上工作的应用程序不再是.NET hackery的深层领域,而是一个相对简单的努力。当然,库,服务和应用程序只有Windows或者只能针对特定平台 - 但Java(广泛地说)也是如此。

如果我现在处于OP的位置,我可以认为语言或技术堆栈中没有任何固有的原因会妨碍我从这一点开始为任何应用程序选择.NET。


#3 热门回答(54 赞)

我实际上在.NET中开发,首先在Mono上运行我的所有测试,然后在Windows上运行。这样我知道我的应用程序是跨平台的。我在ASP.NET和Winforms应用程序上都做得非常成功。

我不确定某些人会在哪里得到Mono如此可怕的印象,但它确实在我的案例和意见中完成了它的工作。对于.NET中最新和最伟大的发明,你会有一点滞后。世界,但到目前为止,Windows和Linux上的.NET 2.0对我来说非常可靠。

请记住,显然有许多怪癖,但大多数都来自确保你编写可移植代码。虽然框架很好地抽象出你正在运行的操作系统,但是像路径和文件名中的Linux区分大小写这样的东西需要一些习惯,就像权限之类的东西一样。

由于Mono基于我迄今为止的经验,.NET绝对是非常跨平台的。