Dieses Dokument vergleicht die Programmiersprachen C# in den Versionen 2.0 und 3.0 mit den Sprachen Java in der Version 6 und ANSI C++ ohne die jeweils vielfältigen Bibliotheken zu berücksichtigen. In den Tabellen ist gelegentlich die Angabe n.a. zu lesen. Diese bedeutet, dass in einer Sprache das entsprechende Konstrukt nicht zur Verfügung steht. Autoren: Rolf Wenger, Stephan Fischli Version 1.0 / 25.05.2008
Umfeld Allgemein Begründer Microsoft Microsoft Sun Microsystems Bjarne Stroustrup Markteinführung 2005 2008 1995 1983 Betriebssysteme CLR.NET 2.0 CLR.NET 2.0 Betriebssysteme mit Cross-Plattform Java VM Standard ECMA 334 ECMA 334 ISO/IEC 23270 Nein ISO/IEC C++ 1998, ISO/IEC C++ 2003 Compiler Microsoft Microsoft Sun, andere Hersteller Viele Hersteller Precompiler Ja Ja Nein Ja Compiler-Schritte 1-Schritt 1-Schritt 1-Schritt i.d.r. 3-Schritt Compiler-Resultat IL-Code IL-Code Byte-Code Maschinencode Bibliothek.NET 2.0.NET 3.5 Java Standard ANSI C++ Library Bibliothek Typsystem.NET 2.0.NET 2.0 Java Sprache C++ Sprache Garbage Collection Ja Ja Ja Nein Code Organisation Trennung Deklaration von Nein Nein Nein Ja Implementation Präprozessor Ja Ja Nein Ja Unterstützung von Namensräumen Ja Ja Ja (Packages) Ja Auslieferungsformat Assembly mit PE Header (.exe,.dll) Assembly mit PE Header (.exe,.dll) Java-Archiv (.jar) Executable mit PE Header (.exe,.dll) Projektorganisation Frei Frei Verzeichnisstruktur muss Package-Hierarchie entsprechen Frei Bindung von Programmteilen Assembly-Name oder -Kennung bei Verwendung starker Namen Assembly-Name oder -Kennung bei Verwendung starker Namen Archiv-Dateiname dynamisch über Klassenpfad definiert Dateiname der Bibliothek Code-Ausführung Kompiliert Kompiliert Interpretiert (fallweise Kompiliert kompiliert) Code-Dokumentation Ja Ja Ja Nein Rolf Wenger, Stephan Fischli 2
Interoperabilität Sprachmix.NET Sprachen.NET Sprachen Nein Nein C nativ Ja Ja Ja, über Java Native Ja Interface (JNI) C++ nativ Ja Ja Ja, über Java Native Ja Interface (JNI) COM Ja Ja Nein Ja Rolf Wenger, Stephan Fischli 3
Einfache Typen Boolean bool bool boolean, Boolean bool Byte byte byte byte, Byte char sbyte sbyte n.a. unsigned char Ganzzahl vorzeichenbehaftet short short short, Short short int int int, Integer int long long long, Long n.a. Ganzzahl vorzeichenlos ushort ushort n.a. unsigned short uint uint n.a. unsigned int ulong ulong n.a. n.a. Floating Point float float float, Float float double double double, Double double decimal decimal n.a. n.a. Zeichen char char char, Character char Zeichenketten string string String string 1 Aufzählungen enum enum n.a. 2 enum Generelle Objektreferenz object object Object n.a. Funktionszeiger delegate delegate n.a. Ja Event-Handling event event n.a. Nein Anonyme Typen Nein Ja Ja (basierend auf Nein Klasse oder Interface) Einfache Arrays Ja Ja Ja Ja Mehrdimensionale Arrays Ja Ja Nein Ja Jagged Arrays (dynamisch Ja Ja Ja Nein mehrdimensionale Arrays) Boxing / Unboxing Ja Ja Ja Nein 1 In ANSI C++ Library 2 Siehe zusammengesetzte Typen Rolf Wenger, Stephan Fischli 4
Zusammengesetzte Typen Sichtbarkeit Kapselung private private private private Vererbbar protected protected n.a. protected Öffentlich public public public public Innerhalb Modul internal internal default n.a. Innerhalb Modul oder vererbbar protected internal protected internal protected n.a. Interfaces interface interface interface n.a. Einfache Vererbung Ja Ja Ja - Mehrfache Vererbung Ja Ja Ja - Konstruktoren Nein Nein Nein - Felder Nein Nein Ja, konstante Felder - Methoden Ja Ja Ja - Eigenschaften (Properties) Ja Ja Implizit durch - get-/set-methoden Events Ja Ja Nein - Indexer Ja Ja Nein - Klassen class class class class Partielle Klassenimplementation Ja Ja Nein Nein Statische Klassen Ja Ja Nein Ja Versiegelte Klassen sealed sealed final n.a. Abstrakte Klassen abstract abstract abstract Implizit über rein virtuelle Methode Einfache Vererbung Ja Ja Ja Ja Mehrfache Vererbung Nein Nein Nein Ja Sichtbarkeitssteuerung Vererbung Nein Nein Nein Ja Realisierung Interface Mehrfach Mehrfach Mehrfach Nein Felder Ja Ja Ja Ja (Elemente) Eigenschaften Ja Ja Implizit durch Nein get-/set-methoden Eigenschaften mit automatischer Nein Ja Nein Nein Feldgenerierung Instanzkonstruktoren Ja, beliebig viele Ja, beliebig viele Ja, beliebig viele Ja, beliebig viele Rolf Wenger, Stephan Fischli 5
Klassenkonstruktoren Ja Ja Ja Nein Objektinitialisierer Nein Ja Nein Ja Destruktoren (deterministisch) Nein Nein Nein Ja Finalizer (nicht determinisitisch) Ja (Destruktor wird zu Ja (Destruktor wird zu Ja (finalize-methode) Nein Finalizer) Finalizer) Methoden Ja Ja Ja Ja Überladen von Methoden Ja Ja Ja Ja Überladen von Operatoren Ja Ja Nein Ja Überdecken (nicht virtuelles Methode mit new Methode mit new Nein Ja Überschreiben) modifizieren modifizieren Virtuelle Methoden Ja Ja Alle Methoden sind Ja virtuell, ausser wenn final spezifiziert Abstrakte Methoden Ja Ja Ja Implizit durch rein virtuelle Methoden Erweiterungsmethoden Nein Ja Nein Nein Partielle Methoden Nein Ja Nein Nein Lambda-Ausdrücke Nein Ja Nein Nein Strukturen struct struct n.a. struct Vererbung Nein Nein - Ja Realisierung Interface Ja Ja - n.a. Konstruktoren kein Defaultkonstruktor kein Defaultkonstruktor - Ja Destruktoren Nein Nein - Ja Aufzählungen n.a. 3 n.a. 3 enum n.a. 3 Felder möglich - - Ja - Methoden möglich - - Ja - 3 Siehe einfache Typen Rolf Wenger, Stephan Fischli 6
Grundelemente Variablen Globale Variablen Nein Nein Nein Ja Explizit typisierte Variablen Ja Ja Ja Ja Implizit typisierte Variablen Nein Ja (nur lokal) Ja Nein const Ja (Instanzvariablen) Ja (Instanzvariablen) Nein Ja (Instanzvariablen) readonly Ja (Instanzvariablen) Ja (Instanzvariablen) Nein Nein static Ja (Instanzvariablen) Ja (Instanzvariablen) Nein Ja Ablaufsteuerung Schleife Kopfsteuerung explizit while, for while, for while, for while, for Schleife Kopfsteuerung implizit foreach foreach for n.a. Schleife Fusssteuerung do while do while do while do while Sprung break, continue, goto break, continue, goto break, continue break, continue, goto Sprung / Rücksprung Schleife yield yield n.a. n.a. Verzweigung einfach if else if else if else if else Verzweigung mehrfach switch switch switch switch Operatoren Vergleiche ==!= >= <= > < ==!= >= <= > < ==!= >= <= > < ==!= >= <= > < Logisch && & ^?: && & ^?: && & ^?: && & ^?: Zuweisung = += -= /= *= %= &= = ^= <<= >>= = += -= /= *= %= &= = ^= <<= >>= = += -= *= /= %= &= ^= = <<= >>= >>>= = += -= /= *= %= &= = ^= <<= >>= Bitverschiebung << >> << >> << >> >>> << >> Arithmetisch + - * / % + - * / % + - * / % + - * / % Unäre x++ ++x x-- --x - +! ~ x++ ++x x++ --x - +! ~ x++ ++x x-- --x- +! ~ x++ ++x x-- --x - +! ~ Verkettung + + + + Index [ ] [ ] [ ] [ ] Referenzen * & ->. 4 * & ->.. * & ->. 4 nur mit Compiler-Flag /unsafe Rolf Wenger, Stephan Fischli 7
Typ-Casting (Typ), as (Typ), as (Typ) (Typ) oder Typ( ) const_cast dynamic_cast reinterpret_cast static_cast Typbestimmung is, typeof() is, typeof() instanceof typeid() Checked / unchecked Ja Ja Nein Nein Diverse new, sizeof, true, false, stackalloc new, sizeof, true, false, stackalloc new new, delete, sizeof Rolf Wenger, Stephan Fischli 8
Erweiterte Konstrukte Exception Handling try catch Ja Ja Ja Ja try finally Ja Ja Ja n.a. try catch finally Ja Ja Ja n.a. Eigene Exception-Klassen Ja Ja Ja Ja Exception-Deklarationen bei Nein Nein Ja Ja Methoden Generische Typen Einfache Generische Typen Ja Ja Ja Ja Vererbung von konkreten Typen Ja Ja Ja Ja Vererbung von generischen Typen Ja Ja Ja Ja Constraints für Typparameter Ja Ja Ja Nein Reflection n.a. Typenabfrage Ja Ja Ja - Zugriff auf private Member Ja Ja Ja - Methodenaufruf Ja Ja Ja - Instanzierung Ja Ja Ja - Threading Thread-Synchronisation lock lock synchronized n.a. Variablenschutz volatile volatile volatile volatile Language Integrated Query LINQ to Objects Nein Ja Nein Nein LINQ to XML Nein Ja Nein Nein LINQ to SQL Nein Ja Nein Nein Attribute / Annotations class : Attribute class : Attribute @interface n.a. Datenmember Ja Ja Ja - Defaultwerte der Datenmember Ja Ja Ja - Anwendbarkeit definierbar Ja Ja Ja - Beibehaltung definierbar Nein Nein Ja - Methoden Ja Ja Nein - Rolf Wenger, Stephan Fischli 9
Schlüsselwörter Vergleich C# 2.0 und 3.0* Java 6 ANSI C++ Werttypen bool, byte, char, decimal, double, enum, float, int, long, sbyte, short, struct, boolean, byte, char, double, float, int, long, short bool, char, double, enum, float, int, long, short, void, wchar_t uint, ulong, ushort Referenztypen class, delegate, interface, object, string class, enum, extends, implements, class, struct, union, template interface Andere Typen void, var* void Modifizierer Statements abstract, const, event, extern, internal, out, override, params, partial, private, protected, public, readonly, ref, sealed, static, unsafe, virtual, volatile break, checked, catch, continue, do while, finally, fixed, for, foreach, get, goto, if-else, lock, return, set, switchcase, throw, try, unchecked, where, while, yield abstract, final, private, protected, public, native, static, strictfp, synchronized, transient, volatile assert, break, case, catch, continue, default, do, else, finally, for, if, return, switch, throw, try, while auto, const, extern, friend, inline, mutable, signed, static, unsigned, private, protected, public, register, virtual, volatile break, catch, continue, do while, goto, for, if-else, return, switch-case, throw, try, while Namensraum namespace, using, extern alias import, package namespace, using Operatoren as, explizit, false, implicit, is, new, instanceof, new operator, sizeof, typeof, true, stackalloc Zugriff base, this super, this base, this Literale default, false, null, true false, null, true default Kontextuell where throws asm, false, typedef, typeid, true Konvertierung dynamic_cast, reinterpret_cast, static_cast LINQ from*, group*, into*, join*, let*, orderby*, select*, where* Präprozessor checksum, define, elif, else, endregion, error, if, line, pragma, region, undef, warning define, elif, else, endif, error, if, ifdef, ifndef, import, include, line, pragma, undef, using Reserviert const, goto Rolf Wenger, Stephan Fischli 10