So dann will ich auch mal meinen Senf zum Thema geben, irgendwie wurde ja soo viel nicht auf die eigentliche Sprache(n) bisher eingegangen:
Also erst mal sind C# und Java schon sehr ähnlich, und verfolgen quasi die gleichen Konzepte. Von demher würde ich beide Sprachen als "gleich" ansehen, und mich je nach Plattform entscheiden. C# ist bestimmt die bessere Wahl, wenn man hauptsächlich für Windows entwickelt. Auch die neusten Erweiterungen von .NET tragen dazu bei (WPF, WCF). Das kommt halt alles aus einem Guss und ist gut zu benutzen. Ansonsten, wenn ich auf wirkliche plattformunabhängigkeit abziele, würde ich eher Java benutzen.
C# ist nicht mehr nur als Java-Abklatsch zu sehen, das ist richtig. Es ist aber definitiv vieles von Java abgekupfert, schließlich wollte Microsoft ja C# auch als Gegenüber zu Java positionieren. Ein Vorteil den C# dabei hat, ist der, dass man hier schon aus SUNs Fehler gelernt hat, und manche Dinge gleich besser gemacht und nicht so viele Altlasten wie SUN mitschleppt (gibt ja einige Dinge in der API vom JDK die nur noch aus Abwärtskompatibilität da sind; Beispiele hierfür gibts genug). Andererseits ist es aber auch so, dass Microsoft auch neue Dinge eingeführt hat, die dann wiederrum von SUN auch in Java übernommen wurden (das genannte Beispiel Generics z.B.). Der Wettbewerb wurde sozusagen belebt, was so schlecht ja nicht ist.
Ansonsten bietet C# ein paar zusätzliche nette zusätzliche Sprachfeatures, die zwar nicht unbedingt vonnöten sind, aber doch ganz brauchbar sind. Beispiele:
- Schlüsselwort partial um große Klassen besser zu managen
- using-Direktive in Kombination mit IDisposable
- Strukturen um einfache Value-Typen zu repräsentieren, wo eine Klasse evtl. oversized wäre
- ....
Was mir dabei aber auch missfällt ist, das, dass darunter IMHO auch tatsächlich die Einfachheit der Sprache etwas leidet. Es gibt mehr Schlüsselwörter und Möglichkeiten. Bestes Beispiel wären hier wieder z.B. die Strukturen, hiuerfür gelten nämlich andere Regeln als für Klassen, was auch zur Verwirrung führen kann. Ansonsten gibts auch noch paar mehr Schlüsselwörter, wodurch man einfach mehr "aufpassen" muss. Da finde ich, dass Java eine weitaus klarere Linie verfolgt. Gefällt mir persönlich besser und führt IMHO zu sauberem Code im Gegensatz zu C#(nicht wie von jemand anderem hier behauptet). Ich finde Microsoft hats hier ein kleines bisschen zu gut gemeint, aber letztendlich spielt das keine so große Rolle.
Was mir an C# im Gegensatz zu Java ein bisschen missfällt ist folgendes:
- Cloning: Das ist in Java auch schon nicht unbedingt optimal gelöst, ist aber in C# IMHO noch beschissener gelöst.
- Exception-Handling: C# ist hier wie C++: Man ist NICHT gezwungen irgendwelche Exceptions zu handeln, und man kann auch keine throws-Direktiven bei Methoden angeben. Das heißt, unter Umständen weiß man nicht mal welche Exceptions von einer Methode geworfen werden können. Man ist auf die reine Code-Dokumentation angewiesen, und das die nicht immer vollständig ist, ist bekannt. Da finde ich den Java-Ansatz besser: Man ist sich immer bewusst welche Exceptions gerade fliegen können, auch wenn man dazu evtl gezwungen ist, etwas mehr Exception-Handling zu betreiben.