C# vs. Java

Java war nach TopPascal und TI-BASIC die erste Programmiersprache, mit der ich in Kontakt kam. Java spielte in meiner Maturitätsarbeit eine grosse Rolle, und auch heute komme ich nicht von Java los. Seit rund einem halben Jahr programmiere ich nun hauptsächlich auf dem .NET-Framework mit C#. Gemäss Mitlernenden ist C# viel besser als Java. Gerne glaube ich ihnen das, aber heute mit diesem Blog möchte ch genauer wissen, wie es um die Unterschiede zwischen den beiden steht.

Was sind die Gemeinsamkeiten?

Ganz zu Beginn muss festgehalten werden, dass die beiden Sprachen sehr viele Dinge gemein haben, und sich sämtliche Vergleiche eher auf Detail-Ebene bewegen. Einige der wichtigsten Gemeinsamkeiten:

  • Beide Sprachen werden in Bytecode kompiliert und auf einer virtuellen Maschine (C# --> CLR, Java --> JVM) ausgeführt.
  • Beide Sprachen sind auf objektorientierte Programmierung ausgelegt und lassen nur einfache Vererbung (single Inheritance) zu. Objekte werden automatisch Garbage-Collected, ohne expliziten Destruktoraufruf.
  • Die Syntax beider Sprachen basiert auf C.

Was ist einfacher zu lernen?

Alles in allem sind die Konzepte und Syntaxen ähnlich genug, um zu sagen, dass wohl C# und Java etwa gleichauf sind, wenn es um die Schwierigkeit geht, diese zu lernen. Die persönliche Erfahrung ist jedoch, dass C# eine nicht unwesentliche Anzahl zusätzlicher Syntax-Features hat, etwa LINQ, welche auch ihre Zeit brauchen, um damit vertraut zu werden.

Ein weit wesentlicher Unterschied ist jedoch, dass C# fast ausschliesslich auf dem .NET-Framework verwendet wird, wobei Java auf einer Vielzahl von Frameworks, welche alle rege verwendet werden, eingesetzt wird. Somit besteht eine gute Chance, dass wenn man zwar Java auf einem Framework gemeistert hat, man bald darauf mit einem bislang unbekannten Framework konfrontiert wird, welches erst kennengelernt werden muss.

Wie unterscheiden sich die Anwendungsbereiche?

Java wurde von Anfang an nach dem Leitsatz "Write once, run anywhere"konzipiert, sodass Java-Anwendungen auf möglichst allen Betriebssystemen verwendet können, ohne dass die eigentliche Anwendung für die einzelnen OS' angepasst werden muss. Bei C# und .NET war das nicht der Fall, jedoch wird dies mit dem Mono-Projekt zurzeit erarbeitet.

 

Häufig ist es aber gar nicht notwendig, dass eine Applikation plattformunabhängig ist, etwa wenn diese serverseitig läuft. Weiter funktioniert die Plattformunabhängigkeit bei Java auch nur, solange keine Betriebssystem-spezifische Libraries verwendet werden. Somit ist dieser Vorteil von Java nur bedingt nützlich.

Wie unterscheiden sich die Sprachfeatures?

Die Beschreibung von C#, als ich zum ersten Mal damit in Kontakt kam, lautete etwa so "C# ist genau gleich wie Java, nur 'string' wird klein geschrieben". Aber neben diesem syntaktischen Unterschied, lassen sich noch einige weitere festhalten:

  • Checked Exceptions: Ein Feature von Java, welches C# vorenthalten blieb, ist die Unterteilung von Exceptions in RuntimeExceptions, Checked Exceptions und Errors. Alle Java-Exceptions welche von der Klasse Exception erben sind checked exceptions und müssen im Code zwangsweise behandelt werden, überall wo sie auftreten können. In C# sind jedoch alle Exceptions unchecked und können im Code ignoriert werden.
  • Polymorphismus: Wenn in C# eine Unterklasse eine Methode mit gleicher Signatur wie die einer Überklasse implementieren will, muss die übergeordnete Methode explizit als "virtual" markiert werden, und die überdeckende mit "override". In Java sind alle Methode automatisch virtual und Überdeckungen können ohne explizite Kennzeichnung erfolgen.
  • LINQ: Die Language-Integrated Queries sind ein sehr umfangreiches und sehr mächtiges Sprachfeature von C#, welche es erlaubt, mit Datensätze sehr elegant umzugehen. Java hat kein vergleichbares Äquivalent.

Neben diesen lassen sich auch noch weitere Punkte finden, wo meistens C# mehr Optionen bietet als Java, etwa betreffend Delegates, Nullable Types oder Flexibilitäten bei Methodenparametern. Vieles sind aber lediglich Code Sugars, also Sprachfeatures, welche den Code leserlicher machen können, aber letztendlich keine vollends neuen Möglichkeiten eröffnen.

Mein Fazit

Auch wenn ich einige Argumente finden konnte, welche C# als diejenige Sprache küren könnten, welche zu bevorzugen wäre, wenn wirklich beide in einem bestimmten Anwendungsfall verwendbar wären, möchte ich für mich (noch) keinen Sieger küren. Ein kurzes Interview mit einem meiner Oberstifte zeigte jedoch einige weitere Vorteile von C# + .NET + Visual Studio auf, insbesondere wenn es um die effiziente und unkomplizierte Webentwicklung geht. In diesem Anwendungsfeld habe ich aber noch keine Erfahrungen sammeln können, und lasse diese also nicht in mein Urteil einfliessen. Sicher scheint jedoch, dass weder C# noch Java so schnell verschwinden werden, womit es wohl am besten ist, sich mit beiden anzufreunden.