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 です。