O Mono faz um trabalho melhor ao direcionar as plataformas que desejo oferecer suporte. Fora isso, é tudo subjetivo.
Compartilho o código C # nas seguintes plataformas: - iOS (iPhone / iPad) - Android - A Web (HTML5) - Mac (OS X) - Linux - Windows
Eu poderia compartilhar ainda mais lugares: - Windows Phone 7 - Wii - XBox - PS3 - etc.
O mais importante é o iOS, já que o MonoTouch funciona de maneira fantástica. Não conheço nenhuma boa maneira de direcionar o iOS com Java. Você não pode direcionar o Windows Phone 7 com Java, então eu diria que os dias em que o Java era melhor para dispositivos móveis já passou.
O maior fator para mim é a produtividade pessoal (e felicidade). C # como linguagem está anos à frente do Java IMHO e o .NET framework é uma alegria de usar. A maior parte do que está sendo adicionado no Java 7 e Java 8 está em C # há anos. Linguagens JVM como Scala e Clojure (ambas disponíveis no CLR) são muito boas.
Vejo o Mono como uma plataforma por si só (uma ótima) e trato o .NET como a implementação do Mono da Microsoft no Windows. Isso significa que eu desenvolvo e testo no Mono primeiro. Isso funciona maravilhosamente bem.
Se Java e .NET (Mono, digamos) fossem projetos de código aberto sem nenhum apoio corporativo, eu sempre escolheria Mono em vez de Java. Eu acredito que é apenas uma plataforma melhor.
.NET / Mono e JVM são ótimas escolhas, embora eu pessoalmente usasse alguma outra linguagem que não Java na JVM.
Minha opinião sobre alguns dos outros comentários:
Questão: Desempenho.
** Resposta: Tanto o JVM quanto o CLR têm um desempenho melhor do que os detratores dizem. Eu diria que o JVM tem melhor desempenho. Mono é geralmente mais lento do que .NET (embora nem sempre).
Eu pessoalmente escolheria ASP.NET MVC em vez de J2EE qualquer dia, tanto como desenvolvedor quanto como usuário final. O suporte para o cliente nativo do Google também é muito bom. Além disso, sei que o baixo desempenho da GUI para aplicativos Java de desktop deve ser uma coisa do passado, mas continuo encontrando alguns lentos. Então, novamente, eu poderia dizer o mesmo para WPF. GTK # é muito rápido, então não há razão para que sejam lentos.
Problema: Java tem um ecossistema maior de bibliotecas disponíveis.
Resposta: Provavelmente verdade, mas não é um problema na prática.
Praticamente todas as bibliotecas Java (incluindo o JDK) funcionam perfeitamente em .NET / Mono graças ao IKVM.NET . Esta tecnologia é uma verdadeira maravilha. A integração é incrível; você pode usar uma biblioteca Java como se fosse nativa. No entanto, só precisei usar bibliotecas Java em um aplicativo .NET. O ecossistema .NET / Mono geralmente oferece mais do que eu preciso.
Problema: Java tem um suporte melhor (mais amplo) a ferramentas
Resposta: Não no Windows. Caso contrário, eu concordo. MonoDevelop é bom.
Quero agradecer ao MonoDevelop ; é uma joia. O MonoDevelop integra a maioria das ferramentas que desejo usar, incluindo autocompletar código (intellisense), integração Git / Subversion, suporte para testes de unidade, integração SQL, depuração, refatoração fácil e navegação de montagem com descompilação instantânea. É maravilhoso usar o mesmo ambiente para tudo, desde a web do lado do servidor até aplicativos móveis.
Problema: compatibilidade entre plataformas.
Resposta: Mono é uma única base de código em todas as plataformas, incluindo Windows.
Desenvolva primeiro para Mono e implante em .NET no Windows, se desejar. Se você comparar o .NET do MS ao Java, então o Java tem a vantagem em termos de consistência entre plataformas. Veja a próxima resposta ...
Problema: Mono lags .NET.
Resposta: Não, não. IMHO, esta é uma afirmação frequentemente afirmada, mas incorreta.
A distribuição Mono do Xamarin vem com C #, VB.NET, F #, IronPython, IronRuby e acho que talvez Boo fora da caixa. O compilador Mono C # está totalmente atualizado com o MS. O compilador Mono VB.NET atrasa a versão MS. Os outros compiladores são iguais em ambas as plataformas (assim como outras linguagens .NET como Nemerle, Boo e Phalanger (PHP)).
O Mono vem com muito do código real escrito pela Microsoft, incluindo o Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F # e ASP.NET MVC. Como o Razor não é Open Source, o Mono atualmente vem com o MVC2, mas o MVC3 funciona perfeitamente no Mono.
A plataforma Mono central acompanhou o ritmo do .NET por muitos anos e a compatibilidade é impressionante. Você pode usar a linguagem C # 4.0 completa e até mesmo alguns recursos do C # 5.0 hoje. Na verdade, o Mono costuma liderar o .NET de várias maneiras.
Mono implementa partes da especificação CLR que nem mesmo a Microsoft oferece suporte (como matrizes de 64 bits). Uma das novas tecnologias mais interessantes do mundo .NET é Rosylyn . Mono oferece o compilador C # como um serviço há muitos anos. Algumas das ofertas de Rosylyn também estão disponíveis via NRefractory . Um exemplo de onde o Mono ainda está à frente seriam as instruções SIMD para acelerar o desempenho dos jogos.
A Microsoft oferece vários produtos além do .NET que não estão disponíveis no Mono, de onde vem o equívoco sobre o atraso do Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) são exemplos de produtos que não funcionam ou têm suporte insuficiente no Mono. A solução óbvia é usar alternativas de plataforma cruzada como GTK #, NHibernate e ServiceStack.
Problema: a Microsoft é má.
Resposta: Verdade. E daí.
Muitas pessoas oferecem os seguintes motivos para evitar o uso do Mono:
1) Você não deve usar Mono porque a tecnologia da Microsoft deve ser evitada
2) Mono é uma merda porque não permite que você use todas as tecnologias que a Microsoft oferece
Para mim, está claro que essas afirmações são incompatíveis. Eu rejeito a primeira afirmação, mas vou pular esse argumento aqui. A segunda afirmação é verdadeira para todas as alternativas .NET.
A JVM é uma ótima plataforma e a explosão de linguagens JVM é incrível. Use o que te faz feliz. Por enquanto, geralmente é .NET / Mono para mim.