Mono hace un mejor trabajo al apuntar a las plataformas que quiero admitir. Aparte de eso, todo es subjetivo.
Comparto código C # en las siguientes plataformas: - iOS (iPhone / iPad) - Android - La Web (HTML5) - Mac (OS X) - Linux - Windows
Podría compartirlo en más lugares: - Windows Phone 7 - Wii - XBox - PS3 - etc.
Lo más importante es iOS, ya que MonoTouch funciona fantásticamente. No conozco ninguna buena forma de apuntar a iOS con Java. No puedes apuntar a Windows Phone 7 con Java, por lo que diría que los días en que Java era mejor para dispositivos móviles han quedado atrás.
Sin embargo, el factor más importante para mí es la productividad personal (y la felicidad). C # como lenguaje está años por delante de Java en mi humilde opinión y el marco .NET es un placer de usar. La mayor parte de lo que se agrega en Java 7 y Java 8 ha estado en C # durante años. Sin embargo, los lenguajes JVM como Scala y Clojure (ambos disponibles en CLR) son bastante buenos.
Veo a Mono como una plataforma por derecho propio (excelente) y trato a .NET como la implementación de Microsoft de Mono en Windows. Esto significa que primero desarrollo y pruebo en Mono. Esto funciona de maravilla.
Si tanto Java como .NET (digamos Mono) fueran proyectos de código abierto sin ningún respaldo corporativo, elegiría Mono sobre Java cada vez. Creo que es una plataforma mejor.
Tanto .NET / Mono como la JVM son excelentes opciones, aunque personalmente usaría algún otro lenguaje que no sea Java en la JVM.
Mi opinión sobre algunos de los otros comentarios:
Problema: rendimiento.
** Respuesta: Tanto la JVM como la CLR funcionan mejor que lo que dicen los detractores. Diría que la JVM funciona mejor. Mono es generalmente más lento que .NET (aunque no siempre).
Yo personalmente tomaría ASP.NET MVC sobre J2EE cualquier día, tanto como desarrollador como como usuario final. El soporte para Google Native Client también es bastante bueno. Además, sé que se supone que el bajo rendimiento de la GUI para las aplicaciones Java de escritorio es cosa del pasado, pero sigo encontrando aplicaciones lentas. Por otra parte, podría decir lo mismo de WPF. GTK # es bastante rápido, por lo que no hay razón para que sean lentos.
Problema: Java tiene un ecosistema más amplio de bibliotecas disponibles.
Respuesta: Probablemente sea cierto, pero en la práctica no es un problema.
Prácticamente todas las bibliotecas de Java (incluido el JDK) se ejecutan perfectamente en .NET / Mono gracias a IKVM.NET . Esta pieza de tecnología es una verdadera maravilla. La integración es asombrosa; puede usar una biblioteca Java como si fuera nativa. Sin embargo, solo he tenido que usar bibliotecas Java en una aplicación .NET. El ecosistema .NET / Mono generalmente ofrece más de lo que necesito.
Problema: Java tiene un mejor (más amplio) soporte de herramientas
Respuesta: no en Windows. De lo contrario, estoy de acuerdo. Sin embargo, MonoDevelop es bueno.
Quiero dar un saludo a MonoDevelop ; es una joya. MonoDevelop integra la mayoría de las herramientas que quiero usar, incluida la finalización de código (intellisense), la integración de Git / Subversion, el soporte para pruebas unitarias, la integración de SQL, la depuración, la fácil refactorización y la exploración de ensamblajes con descompilación sobre la marcha. Es maravilloso usar el mismo entorno para todo, desde la web del lado del servidor hasta las aplicaciones móviles.
Problema: compatibilidad entre plataformas.
Respuesta: Mono es una base de código única en todas las plataformas, incluido Windows.
Desarrolle primero para Mono e impleméntelo en .NET en Windows si lo desea. Sin embargo, si compara .NET de MS con Java, Java tiene la ventaja en términos de coherencia entre plataformas. Ver siguiente respuesta ...
Problema: Mono se retrasa .NET.
Respuesta: No, no es así. En mi humilde opinión, esta es una declaración a menudo declarada pero incorrecta.
La distribución Mono de Xamarin se envía con C #, VB.NET, F #, IronPython, IronRuby y creo que tal vez Boo fuera de la caja. El compilador Mono C # está completamente actualizado con MS. El compilador Mono VB.NET se retrasa con respecto a la versión de MS. Los otros compiladores son los mismos en ambas plataformas (al igual que otros lenguajes .NET como Nemerle, Boo y Phalanger (PHP)).
Mono se envía con gran parte del código escrito de Microsoft, incluido Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F # y ASP.NET MVC. Debido a que Razor no es de código abierto, Mono actualmente se envía con MVC2, pero MVC3 funciona bien en Mono.
La plataforma principal Mono ha seguido el ritmo de .NET durante muchos años y la compatibilidad es impresionante. Puede usar el lenguaje C # 4.0 completo e incluso algunas características de C # 5.0 hoy. De hecho, Mono a menudo lidera .NET de muchas maneras.
Mono implementa partes de la especificación CLR que ni siquiera Microsoft admite (como matrices de 64 bits). Una de las nuevas tecnologías más interesantes del mundo .NET es Rosylyn . Mono ha ofrecido el compilador de C # como servicio durante muchos años. Algunas de las ofertas de Rosylyn también están disponibles a través de NRefractory . Un ejemplo de dónde Mono todavía está por delante serían las instrucciones SIMD para acelerar el rendimiento de los juegos.
Microsoft ofrece una serie de productos además de .NET que no están disponibles en Mono, de donde proviene la idea errónea sobre el retraso Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) son ejemplos de productos que no funcionan o no son compatibles con Mono. La solución obvia es utilizar alternativas multiplataforma como GTK #, NHibernate y ServiceStack.
Problema: Microsoft es malvado.
Respuesta: Verdadero. Y qué.
Mucha gente ofrece las siguientes razones para evitar el uso de Mono:
1) No debe usar Mono porque debe evitarse la tecnología de Microsoft
2) Mono apesta porque no te permite usar todas las tecnologías que ofrece Microsoft
Para mí, está claro que estas declaraciones son incompatibles. Rechazo la primera declaración, pero omitiré ese argumento aquí. La segunda afirmación es cierta para todas las alternativas de .NET.
La JVM es una gran plataforma y la explosión de lenguajes JVM es asombrosa. Usa lo que te haga feliz. Por ahora, eso es a menudo .NET / Mono para mí.