Bueno... Java es en realidad más portátil. Mono no está implementado en todas partes, y está significativamente a la zaga de la implementación de Microsoft. El SDK de Java parece estar mejor sincronizado entre plataformas (y funciona en más plataformas).
También diría que Java tiene más herramientas disponibles en todas esas plataformas, aunque hay muchas herramientas disponibles para .NET en plataformas Windows.
Actualización para 2014
Todavía mantengo esta opinión en 2014. Sin embargo, calificaré esto diciendo que ahora estoy empezando a prestar atención a Mono después de un largo tiempo de no preocuparme realmente, por lo que puede haber mejoras en el tiempo de ejecución de Mono (o ecosistema ) de la que no he sido informado. AFAIK, todavía no hay soporte para WPF, WCF, WF, de WIF. Mono puede ejecutarse en iOS, pero que yo sepa, el tiempo de ejecución de Java todavía se ejecuta en muchas más plataformas que Mono. Además, Mono está comenzando a ver algunas herramientas muy mejoradas (Xamarin), y Microsoft parece tener una actitud y una voluntad de trabajar con socios mucho más multiplataforma para que sean complementarios, en lugar de competitivos (por ejemplo, Mono será una parte bastante importante del próximo panorama OWIN/Helios ASP.NET). Sospecho que en los próximos años las diferencias en portabilidad disminuirán rápidamente, especialmente después de que .NET sea de código abierto.
Actualización para 2018
Mi opinión sobre esto está empezando a ir hacia el otro lado. Creo que .NET, en general, particularmente con .NET Core, ha comenzado a lograr la "paridad de portabilidad" con Java. Se están realizando esfuerzos para llevar WPF a .NET Core para algunas plataformas, y .NET Core se ejecuta en muchas plataformas ahora. Mono (propiedad de Xamarin, que ahora es propiedad de Microsoft) es un producto más maduro y pulido que nunca, y escribir aplicaciones que funcionen en múltiples plataformas ya no es el dominio de la gnosis profunda de la piratería de .NET, sino que es un esfuerzo relativamente sencillo. . Hay, por supuesto, bibliotecas, servicios y aplicaciones que son solo para Windows o solo pueden dirigirse a plataformas específicas, pero lo mismo puede decirse de Java (en términos generales).
Si estuviera en el lugar del OP en este punto, no puedo pensar en ninguna razón inherente a los lenguajes o pilas tecnológicas que me impidan elegir .NET para cualquier aplicación en el futuro a partir de este punto.
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- Web (HTML5)- Mac (OS X)- Linux- Windows
Podría compartirlo incluso en más lugares:- Windows Phone 7- Wii- XBox- PS3- etc.
El problema es iOS, ya que MonoTouch funciona fantásticamente. No conozco ninguna buena manera de apuntar a iOS con Java. No puede 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 quedaron 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 (una 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 maravillosamente.
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 simplemente una mejor plataforma.
Tanto .NET/Mono como JVM son excelentes opciones, aunque yo personalmente usaría algún otro lenguaje que no sea Java en JVM.
Mi opinión sobre algunos de los otros comentarios:
Problema:Rendimiento.
**Respuesta:tanto JVM como CLR funcionan mejor de lo que dicen los detractores. Yo 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 como desarrollador y usuario final. La compatibilidad con Google Native Client también es genial. 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 las lentas. Por otra parte, podría decir lo mismo de WPF. Sin embargo, GTK# es bastante rápido, por lo que no hay motivo para que sea lento.
Problema:Java tiene un ecosistema más grande de bibliotecas disponibles.
Respuesta:Probablemente sea cierto, pero no es un problema en la práctica.
Prácticamente todas las bibliotecas de Java (incluida la 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 una compatibilidad con herramientas mejor (más amplia)
Respuesta:No en Windows. De lo contrario estoy de acuerdo. Sin embargo, MonoDevelop está bien.
Quiero dar un reconocimiento 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, la compatibilidad con pruebas unitarias, la integración de SQL, la depuración, la refactorización sencilla y la exploración de ensamblados 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 única base de código en todas las plataformas, incluido Windows.
Desarrolle primero para Mono e implemente 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 retrasa .NET.
Respuesta:No, no lo hace. En mi humilde opinión, esta es una declaración a menudo declarada pero incorrecta.
La distribución Mono de Xamarin se entrega con C#, VB.NET, F#, IronPython, IronRuby y creo que quizás Boo fuera de la caja. El compilador Mono C# está completamente actualizado con MS. El compilador Mono VB.NET retrasa 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 incluye gran parte del código escrito real 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 de 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 suele liderar a .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 piezas de tecnología más emocionantes en el mundo de .NET es Rosylyn. Mono ha ofrecido el compilador de C# como servicio durante muchos años. Parte de lo que ofrece Rosylyn también está disponible a través de NRefractory. Un ejemplo de donde 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 de Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) son ejemplos de productos que no funcionan o tienen un soporte deficiente en Mono. La solución obvia es utilizar alternativas multiplataforma como GTK#, NHibernate y ServiceStack.
Problema:Microsoft es malvado.
Respuesta:Cierto. ¿Y qué?
Muchas personas ofrecen 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 válida para todas las alternativas de .NET.
JVM es una gran plataforma y la explosión de lenguajes JVM es increíble. Usa lo que te hace feliz. Por ahora, eso suele ser .NET/Mono para mí.