Mono kann besser auf die Plattformen abzielen, die ich unterstützen möchte. Davon abgesehen ist alles subjektiv.
Ich teile C # -Code auf folgenden Plattformen: - iOS (iPhone / iPad) - Android - Das Web (HTML5) - Mac (OS X) - Linux - Windows
Ich könnte es noch mehr Orte teilen: - Windows Phone 7 - Wii - XBox - PS3 - etc.
Das große Problem ist iOS, da MonoTouch fantastisch funktioniert. Ich kenne keine gute Möglichkeit, iOS mit Java zu erreichen. Sie können Windows Phone 7 nicht mit Java als Ziel festlegen, daher würde ich sagen, dass die Tage, in denen Java für Mobilgeräte besser ist, hinter uns liegen.
Der größte Faktor für mich ist jedoch die persönliche Produktivität (und das Glück). C # als Sprache ist Java IMHO um Jahre voraus, und die Verwendung des .NET-Frameworks ist eine Freude. Das meiste, was in Java 7 und Java 8 hinzugefügt wird, ist seit Jahren in C #. JVM-Sprachen wie Scala und Clojure (beide in der CLR verfügbar) sind allerdings ziemlich nett.
Ich sehe Mono als eigenständige Plattform (eine großartige) und behandle .NET als die Microsoft-Implementierung von Mono unter Windows. Dies bedeutet, dass ich zuerst Mono entwickle und teste. Das funktioniert wunderbar.
Wenn sowohl Java als auch .NET (sagen wir Mono) Open Source-Projekte ohne Unternehmensunterstützung wären, würde ich jedes Mal Mono gegenüber Java wählen. Ich glaube, es ist nur eine bessere Plattform.
Sowohl .NET / Mono als auch die JVM sind eine gute Wahl, obwohl ich persönlich eine andere Sprache als Java für die JVM verwenden würde.
Meine Meinung zu einigen anderen Kommentaren:
Problem: Leistung.
** Antwort: Sowohl die JVM als auch die CLR schneiden besser ab als Kritiker sagen. Ich würde sagen, dass die JVM besser abschneidet. Mono ist im Allgemeinen langsamer als .NET (wenn auch nicht immer).
Ich persönlich würde ASP.NET MVC jeden Tag sowohl als Entwickler als auch als Endbenutzer über J2EE übertragen. Die Unterstützung für Google Native Client ist auch ziemlich cool. Ich weiß auch, dass eine schlechte GUI-Leistung für Desktop-Java-Apps der Vergangenheit angehören sollte, aber ich finde immer wieder langsame. Andererseits könnte ich dasselbe für WPF sagen. GTK # ist zwar schnell genug, es gibt also keinen Grund, warum sie langsam sein müssen.
Problem: Java verfügt über ein größeres Ökosystem an Bibliotheken.
Antwort: Wahrscheinlich wahr, aber in der Praxis ist dies kein Problem.
Praktisch jede Java-Bibliothek (einschließlich des JDK) läuft dank IKVM.NET nur .and / Mono . Diese Technologie ist ein wahres Wunder. Die Integration ist erstaunlich; Sie können eine Java-Bibliothek so verwenden, als wäre sie nativ. Ich musste allerdings nur Java-Bibliotheken in einer .NET-App verwenden. Das .NET / Mono-Ökosystem bietet im Allgemeinen mehr als ich brauche.
Problem: Java bietet eine bessere (umfassendere) Unterstützung für Tools
Antwort: Nicht unter Windows. Ansonsten stimme ich zu. MonoDevelop ist allerdings nett.
Ich möchte MonoDevelop einen Gruß aussprechen . Es ist ein Juwel. MonoDevelop integriert die meisten Tools, die ich verwenden möchte, einschließlich Code-Vervollständigung (Intellisense), Git / Subversion-Integration, Unterstützung für Komponententests, SQL-Integration, Debugging, einfaches Refactoring und Durchsuchen von Assemblys mit On-the-Fly-Dekompilierung. Es ist wunderbar, dieselbe Umgebung für alles zu verwenden, vom serverseitigen Web bis hin zu mobilen Apps.
Problem: Kompatibilität zwischen Plattformen.
Antwort: Mono ist eine einzige Codebasis auf allen Plattformen, einschließlich Windows.
Entwickeln Sie zuerst für Mono und stellen Sie es unter Windows in .NET bereit, wenn Sie möchten. Wenn Sie jedoch .NET von MS mit Java vergleichen, hat Java den Vorteil hinsichtlich der plattformübergreifenden Konsistenz. Siehe nächste Antwort ...
Problem: Mono bleibt hinter .NET zurück.
Antwort: Nein, tut es nicht. IMHO, dies ist eine oft angegebene, aber falsche Aussage.
Die Mono-Distribution von Xamarin wird mit C #, VB.NET, F #, IronPython, IronRuby und Boo ausgeliefert. Der Mono C # -Compiler ist mit MS vollständig auf dem neuesten Stand. Der Mono VB.NET-Compiler liegt hinter der MS-Version zurück. Die anderen Compiler sind auf beiden Plattformen gleich (wie auch andere .NET-Sprachen wie Nemerle, Boo und Phalanger (PHP)).
Mono wird mit einem Großteil des von Microsoft geschriebenen Codes geliefert, einschließlich DLR (Dynamic Language Runtime), MEF (Managed Extensibility Framework), F # und ASP.NET MVC. Da Razor nicht Open Source ist, wird Mono derzeit mit MVC2 ausgeliefert, MVC3 funktioniert jedoch einwandfrei mit Mono.
Die Kernplattform von Mono hat mit .NET oder vielen Jahren Schritt gehalten und die Kompatibilität ist beeindruckend. Sie können heute die vollständige C # 4.0-Sprache und sogar einige C # 5.0-Funktionen verwenden. Tatsächlich führt Mono .NET häufig in vielerlei Hinsicht an.
Mono implementiert Teile der CLR-Spezifikation, die selbst Microsoft nicht unterstützt (wie 64-Bit-Arrays). Eine der aufregendsten neuen Technologien in der .NET-Welt ist Rosylyn . Mono bietet den C # -Compiler seit vielen Jahren als Service an. Einige der Angebote von Rosylyn sind auch über NRefractory erhältlich . Ein Beispiel dafür, wo Mono noch vorne liegt, wären die SIMD-Anweisungen zur Beschleunigung der Spieleleistung.
Microsoft bietet zusätzlich zu .NET eine Reihe von Produkten an, die in Mono nicht verfügbar sind. Dies ist der Grund für das Missverständnis über Mono-Verzögerungen. Windows Presentation Foundation (WPF), Entity Framework (EF) und WCF (Windows Communication Foundation) sind Beispiele für Produkte, die unter Mono nicht funktionieren oder nur unzureichend unterstützt werden. Die naheliegende Lösung besteht darin, stattdessen plattformübergreifende Alternativen wie GTK #, NHibernate und ServiceStack zu verwenden.
Problem: Microsoft ist böse.
Antwort: Richtig. Na und.
Viele Menschen bieten die folgenden Gründe an, um die Verwendung von Mono zu vermeiden:
1) Sie sollten Mono nicht verwenden, da Microsoft-Technologie vermieden werden sollte
2) Mono ist zum Kotzen, weil Sie nicht jede von Microsoft angebotene Technologie verwenden können
Mir ist klar, dass diese Aussagen nicht kompatibel sind. Ich lehne die erste Aussage ab, werde dieses Argument aber hier überspringen. Die zweite Aussage gilt für alle .NET-Alternativen.
Die JVM ist eine großartige Plattform und die Explosion der JVM-Sprachen ist fantastisch. Verwenden Sie, was Sie glücklich macht. Im Moment ist das für mich oft .NET / Mono.