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には、利用可能なライブラリのより大きなエコシステムがあります。
回答:おそらく正しいですが、実際には問題ではありません。
実質的にすべてのJavaライブラリ(JDKを含む)は、IKVM.NETのおかげで。この技術はまさに驚異的です。統合は素晴らしいです。ネイティブと同じようにJavaライブラリを使用できます。ただし、1つの.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が同梱されています。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は、.NETに加えてMonoでは利用できない多くの製品を提供していますが、これはMonoの遅延に関する誤解が原因でした。Windows Presentation Foundation(WPF)、Entity Framework(EF)、WCF(Windows Communication Foundation)は、Monoで機能しない、またはサポートが不十分な製品の例です。明白な解決策は、代わりにGTK#、NHibernate、ServiceStackなどのクロスプラットフォームの代替手段を使用することです。
問題:マイクロソフトは悪です。
正解です。だから何。
多くの人々は、Monoの使用を避けるために次の理由を提供しています。
1)Microsoftの技術を回避する必要があるため、Monoを使用しないでください。
2)Monoは、Microsoftが提供するすべてのテクノロジを使用できるわけではないため、
私には、これらのステートメントに互換性がないことは明らかです。私は最初のステートメントを拒否しますが、ここではその議論をスキップします。2番目のステートメントは、すべての.NET代替案に当てはまります。
JVMは優れたプラットフォームであり、JVM言語の急増は素晴らしいものです。幸せになるものを使ってください。今のところ、それは私にとってしばしば.NET / Monoです。