Mono fa un lavoro migliore nel mirare alle piattaforme che desidero supportare. A parte questo, è tutto soggettivo.
Condivido il codice C # sulle seguenti piattaforme: - iOS (iPhone / iPad) - Android - Il Web (HTML5) - Mac (OS X) - Linux - Windows
Potrei condividerlo ancora più posti: - Windows Phone 7 - Wii - XBox - PS3 - ecc.
Il grande vantaggio è iOS da MonoTouch funziona in modo fantastico. Non conosco alcun buon modo per indirizzare iOS con Java. Non puoi scegliere come target Windows Phone 7 con Java, quindi direi che i giorni in cui Java era migliore per i dispositivi mobili sono ormai alle spalle.
Il fattore più importante per me, però, è la produttività personale (e la felicità). C # come linguaggio è anni avanti rispetto a Java IMHO e il framework .NET è una gioia da usare. La maggior parte di ciò che viene aggiunto in Java 7 e Java 8 è in C # da anni. I linguaggi JVM come Scala e Clojure (entrambi disponibili su CLR) sono comunque molto carini.
Vedo Mono come una piattaforma a sé stante (eccezionale) e considero .NET come l'implementazione Microsoft di Mono su Windows. Ciò significa che sviluppo e provo prima su Mono. Funziona meravigliosamente.
Se sia Java che .NET (diciamo Mono) fossero progetti Open Source senza alcun supporto aziendale, sceglierei ogni volta Mono su Java. Credo che sia solo una piattaforma migliore.
Sia .NET / Mono che JVM sono ottime scelte, anche se personalmente userei un linguaggio diverso da Java sulla JVM.
La mia opinione su alcuni degli altri commenti:
Problema: prestazioni.
** Risposta: Sia la JVM che il CLR hanno prestazioni migliori di quanto affermano i detrattori. Direi che la JVM funziona meglio. Mono è generalmente più lento di .NET (anche se non sempre).
Personalmente prenderei ASP.NET MVC su J2EE ogni giorno sia come sviluppatore che come utente finale. Anche il supporto per Google Native Client è piuttosto interessante. Inoltre, so che le scarse prestazioni della GUI per le app Java desktop dovrebbero essere un ricordo del passato, ma continuo a trovarne di lente. Poi di nuovo, potrei dire lo stesso per WPF. GTK # è molto veloce, quindi non c'è motivo per cui debbano essere lenti.
Problema: Java ha un ecosistema di librerie più ampio disponibile.
Risposta: Probabilmente è vero, ma in pratica non è un problema.
Praticamente tutte le librerie Java (incluso JDK) funzionano alla grande su .NET / Mono grazie a IKVM.NET . Questo pezzo di tecnologia è una vera meraviglia. L'integrazione è sorprendente; puoi usare una libreria Java proprio come se fosse nativa. Tuttavia, ho dovuto utilizzare solo le librerie Java in un'app .NET. L'ecosistema .NET / Mono generalmente offre più del necessario.
Problema: Java ha un supporto migliore (più ampio) per gli strumenti
Risposta: non su Windows. Altrimenti sono d'accordo. MonoDevelop è carino però.
Voglio fare un grido a MonoDevelop ; è un gioiello. MonoDevelop integra la maggior parte degli strumenti che desidero utilizzare, tra cui il completamento del codice (intellisense), l'integrazione Git / Subversion, il supporto per i test di unità, l'integrazione SQL, il debug, il refactoring semplice e la navigazione in assembly con la decompilazione al volo. È meraviglioso utilizzare lo stesso ambiente per qualsiasi cosa, dal Web lato server alle app mobili.
Problema: compatibilità tra piattaforme.
Risposta: Mono è una singola base di codice su tutte le piattaforme, incluso Windows.
Sviluppa prima per Mono e distribuisci su .NET su Windows, se lo desideri. Se confronti .NET da MS a Java, però, Java ha il vantaggio in termini di coerenza tra le piattaforme. Vedi risposta successiva ...
Problema: Mono ritarda .NET.
Risposta: No, non lo fa.IMHO, questa è un'affermazione spesso dichiarata ma errata.
La distribuzione Mono di Xamarin viene fornita con C #, VB.NET, F #, IronPython, IronRuby e penso che forse Boo fuori dagli schemi. Il compilatore Mono C # è completamente aggiornato con MS. Il compilatore Mono VB.NET è in ritardo rispetto alla versione MS. Gli altri compilatori sono gli stessi su entrambe le piattaforme (così come altri linguaggi .NET come Nemerle, Boo e Phalanger (PHP)).
Mono viene fornito con gran parte del codice scritto Microsoft effettivo, inclusi Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F # e ASP.NET MVC. Poiché Razor non è Open Source, Mono attualmente viene fornito con MVC2 ma MVC3 funziona perfettamente su Mono.
La piattaforma Mono principale ha tenuto il passo con .NET da molti anni e la compatibilità è impressionante. Oggi è possibile utilizzare l'intero linguaggio C # 4.0 e anche alcune funzionalità di C # 5.0. In effetti, Mono spesso guida .NET in molti modi.
Mono implementa parti della specifica CLR che nemmeno Microsoft supporta (come gli array a 64 bit). Una delle nuove tecnologie più interessanti nel mondo .NET è Rosylyn . Mono ha offerto il compilatore C # come servizio da molti anni. Parte di ciò che offre Rosylyn è disponibile anche tramite NRefractory . Un esempio di dove Mono è ancora avanti sarebbero le istruzioni SIMD per accelerare le prestazioni di gioco.
Microsoft offre una serie di prodotti oltre a .NET che non sono disponibili in Mono, da cui deriva il malinteso sul ritardo di Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) sono esempi di prodotti che non funzionano o sono scarsamente supportati su Mono. La soluzione più ovvia è utilizzare invece alternative multipiattaforma come GTK #, NHibernate e ServiceStack.
Problema: Microsoft è il male.
Risposta: vero. E allora.
Molte persone offrono i seguenti motivi per evitare di utilizzare Mono:
1) Non dovresti usare Mono perché la tecnologia Microsoft dovrebbe essere evitata
2) Mono fa schifo perché non ti consente di utilizzare tutte le tecnologie offerte da Microsoft
Per me è chiaro che queste affermazioni sono incompatibili. Respingo la prima affermazione, ma qui salterò l'argomento. La seconda affermazione è vera per tutte le alternative .NET.
La JVM è un'ottima piattaforma e l'esplosione dei linguaggi JVM è impressionante. Usa ciò che ti rende felice. Per ora, questo è spesso .NET / Mono per me.