まあ....Javaは実際にはより移植性があります。 Mono はどこでも実装されているわけではなく、Microsoft の実装に大きく遅れをとっています。 Java SDK は、プラットフォーム間でよりよく同期しているようです (そして、より多くのプラットフォームで動作します)。
また、Windows プラットフォーム上の .NET で利用できるツールはたくさんありますが、Java はこれらすべてのプラットフォームでより多くのツールを利用できるとも言えます。
2014 年の更新
私は 2014 年もこの意見を保持しています。ただし、Mono ランタイム (またはエコシステム) が改善される可能性があります。 ) 知らされていませんでした。私の知る限り、WPF、WCF、WF、WIF はまだサポートされていません。 Mono は iOS で実行できますが、私の知る限り、Java ランタイムは引き続き Mono よりもはるかに多くのプラットフォームで実行されます。また、Mono には大幅に改善されたツール (Xamarin) が見られるようになり始めており、Microsoft はパートナーと協力して競争ではなく補完的なものにするためのクロスプラットフォームの姿勢と意欲を持っているようです (たとえば、Mono は今後の OWIN/Helios ASP.NET ランドスケープの非常に重要な部分です)。特に .NET がオープンソース化された後は、今後数年間で移植性の違いが急速に減少すると思われます。
2018 年の更新
これに対する私の見解は、逆方向に進み始めています。 .NET は、広く、特に .NET Core を使用して、Java との "移植性パリティ" を達成し始めていると思います。一部のプラットフォームの .NET Core に WPF を導入する取り組みが進行中であり、.NET Core 自体は現在、非常に多くのプラットフォームで実行されています。 Mono (Xamarin が所有し、現在は Microsoft が所有) はこれまで以上に成熟した洗練された製品であり、複数のプラットフォームで動作するアプリケーションを作成することは、もはや .NET ハッカーの深い知識の領域ではなく、比較的単純な試みです。 .もちろん、ライブラリ、サービス、およびアプリケーションは、Windows 専用であるか、特定のプラットフォームのみをターゲットにすることができますが、Java についても (広く) 同じことが言えます。
この時点で私が OP の立場にあったとしたら、この時点からアプリケーションに .NET を選択することを妨げる言語または技術スタック自体に固有の理由は考えられません。
Mono は、私がサポートしたいプラットフォームをターゲットにするのに適しています。それ以外はすべて主観です。
次のプラットフォームで C# コードを共有しています:- iOS (iPhone/iPad)- Android- Web (HTML5)- Mac (OS X)- Linux- Windows
さらに多くの場所で共有できます:- Windows Phone 7- Wii- XBox- PS3- など
MonoTouch は素晴らしく機能するので、大物は iOS です。 Java で iOS をターゲットにする良い方法がわかりません。 Java で Windows Phone 7 をターゲットにすることはできないため、Java がモバイルに適している時代は過ぎ去ったと言えます。
私にとって最大の要因は、個人の生産性 (および幸福度) です。言語としての C# は Java IMHO よりも何年も先を行っており、.NET フレームワークは楽しく使用できます。 Java 7 と Java 8 で追加されたもののほとんどは、何年もの間 C# にありました。ただし、Scala や Clojure (どちらも CLR で利用可能) などの JVM 言語は非常に優れています。
私は、Mono を独自のプラットフォーム (素晴らしいプラットフォーム) と見なしており、.NET を Windows 上の Mono の Microsoft 実装として扱っています。これは、最初に Mono で開発およびテストすることを意味します。これは素晴らしく機能します。
Java と .NET (Mono としましょう) の両方が企業の支援を受けていないオープン ソース プロジェクトである場合、私は Java よりも常に Mono を選択します。私はそれがより良いプラットフォームであると信じています.
.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 ライブラリをネイティブのように使用できます。ただし、1 つの .NET アプリで Java ライブラリを使用するだけで済みました。 .NET/Mono エコシステムは一般に、必要以上のものを提供します。
問題:Java の方が優れた (より広い) ツール サポートを提供しています
答え:Windows ではありません。そうでなければ私は同意します。ただし、MonoDevelop は便利です。
MonoDevelop に感謝したいと思います。それは宝石です。 MonoDevelop は、コード補完 (intellisense)、Git/Subversion 統合、単体テストのサポート、SQL 統合、デバッグ、簡単なリファクタリング、オンザフライ逆コンパイルによるアセンブリ ブラウジングなど、私が使用したいツールのほとんどを統合しています。サーバー側の Web からモバイル アプリまで、同じ環境を使用できるのは素晴らしいことです。
問題:プラットフォーム間の互換性。
答え:Mono は、Windows を含むすべてのプラットフォームで単一のコードベースです。
最初に Mono 用に開発し、必要に応じて Windows 上の .NET にデプロイします。 MS の .NET と Java を比較すると、Java はプラットフォーム間の一貫性という点で優れています。次の回答を参照してください...
問題:Mono は .NET に遅れます。
答え:いいえ、ありません。 私見ですが、これはよく言われることですが、正しくありません。
Xamarin の Mono ディストリビューションには、C#、VB.NET、F#、IronPython、IronRuby が同梱されています。 Mono C# コンパイラは、MS で完全に最新の状態になっています。 Mono VB.NET コンパイラは、MS バージョンより遅れています。他のコンパイラは両方のプラットフォームで同じです (Nemerle、Boo、Phalanger (PHP) などの他の .NET 言語も同様です)。
Mono には、Dynamic Language Runtime (DLR)、Managed Extensibility Framework (MEF)、F#、ASP.NET MVC など、Microsoft が記述した実際のコードが多数付属しています。 Razor はオープン ソースではないため、Mono は現在 MVC2 と共に出荷されていますが、MVC3 は Mono でも問題なく動作します。
コアの Mono プラットフォームは、.NET または長年にわたって歩調を合わせており、互換性は印象的です。現在、完全な C# 4.0 言語と一部の C# 5.0 機能を使用できます。実際、Mono は多くの点で .NET をリードしています。
Mono は、Microsoft でさえサポートしていない CLR 仕様の一部 (64 ビット配列など) を実装しています。 .NET の世界で最もエキサイティングな新しいテクノロジの 1 つが Rosylyn です。 Mono は、長年にわたって C# コンパイラをサービスとして提供してきました。 Rosylyn が提供するものの一部は、NRefractory からも入手できます。 Mono がまだ先を行っている例としては、ゲームのパフォーマンスを加速する SIMD 命令があります。
Microsoft は、Mono で利用できない .NET 上に多数の製品を提供していますが、これが Mono の遅延に関する誤解の元になっています。 Windows Presentation Foundation (WPF)、Entity Framework (EF)、WCF (Windows Communication Foundation) は、Mono で動作しない、または十分にサポートされていない製品の例です。明らかな解決策は、代わりに GTK#、NHibernate、ServiceStack などのクロスプラットフォームの代替手段を使用することです。
問題:Microsoft は悪です。
答え:そうです。
多くの人が、Mono の使用を避ける次の理由を挙げています。
1) Microsoft の技術は避けるべきなので、Mono を使用しないでください
2) Mono は、Microsoft が提供するすべてのテクノロジを使用できるわけではないので最悪です
私には、これらのステートメントが相容れないことは明らかです。最初のステートメントは却下しますが、ここではその議論をスキップします。 2 番目のステートメントは、すべての .NET 代替案に当てはまります。
JVM は優れたプラットフォームであり、JVM 言語の急増は素晴らしいものです。あなたが幸せになるものを使ってください。今のところ、それは多くの場合、.NET/Mono です。