Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Aktualisiert: November 2007
Die folgende Tabelle enthält wichtige Vergleiche zwischen C# und systemeigenem C++, das /clr nicht verwendet. Wenn Sie C++-Programmierer sind, finden Sie in dieser Tabelle auf einen Blick die wichtigsten Unterschiede zwischen den beiden Programmiersprachen.
Hinweis: |
|---|
C++- und C#-Projekte werden von unterschiedlichen Projektmodellen abgeleitet. Weitere Informationen zu den Unterschieden zwischen C++- und C#-Projekten finden Sie unter Elementverwaltung in Projekten und Verwenden des Projektmappen-Explorers. |
Feature |
Referenzthema |
|---|---|
Vererbung: In C++ sind Klassen und Strukturen praktisch identisch, während sie in C# große Unterschiede aufweisen. C#-Klassen können zwar eine beliebige Anzahl von Schnittstellen implementieren, sie können jedoch nur von einer Basisklasse erben. Außerdem unterstützen C#-Strukturen weder Vererbung noch explizite Standardkonstruktoren (ein Konstruktor wird standardmäßig zur Verfügung gestellt). |
|
Arrays: In C++ ist ein Array ein Zeiger. In C# sind Arrays Objekte, die Methoden und Eigenschaften beinhalten. Zum Beispiel kann die Größe eines Arrays mithilfe der Length-Eigenschaft abgefragt werden. C#-Arrays setzen auch Indexer ein, die jeden Index überprüfen, der zum Zugriff auf das Array verwendet wird. Die Syntax zum Deklarieren von C#-Arrays unterscheidet sich von der für C++-Arrays: Die Token "[]" werden in C# hinter dem Arraytyp und nicht hinter der Variablen angezeigt. |
|
Boolesche Werte: In C++ ist der bool-Typ im Grunde eine ganze Zahl. In C# findet keine Konvertierung zwischen dem bool-Typ und anderen Datentypen statt. |
|
Der long-Typ: In C# umfasst der Datentyp long 64 Bits, während er in C++ 32 Bits umfasst. |
|
Übergeben von Parametern: In C++ werden alle Variablen als Wert übergeben, außer sie werden explizit mit einem Zeiger oder einem Verweis übergeben. In C# werden Klassen als Verweis und Strukturen als Wert übergeben, es sei denn, sie werden mit dem ref-Parametermodifizierer oder dem out-Parametermodifizierer explizit als Verweis übergeben. |
|
Die switch-Anweisung: Im Unterschied zur switch-Anweisung von C++ unterstützt C# kein Fortfahren von einer case-Bezeichnung zur nächsten. |
|
Delegaten: C#-Delegaten entsprechen weitestgehend den Funktionszeigern in C++, und sie sind typsicher und geschützt. |
|
Basisklassenmethoden: C# unterstützt das base-Schlüsselwort zum Aufrufen der überschriebenen Basisklassenmember von abgeleiteten Klassen. Auch das Überschreiben von virtuellen oder abstrakten Methoden ist in C# explizit, wobei das override-Schlüsselwort verwendet wird. |
Siehe Beispiele für override |
Ausblenden von Methoden: C++ unterstützt das implizite "Ausblenden" der Methode durch Vererbung. In C# müssen Sie den new-Modifizierer verwenden, um geerbte Member explizit auszublenden. |
|
Präprozessordirektiven werden für die bedingte Kompilierung benötigt. In C# werden keine Headerdateien verwendet. |
|
Ausnahmebehandlung: In C# sorgt das finally-Schlüsselwort dafür, dass der Code ausgeführt wird, unabhängig davon, ob möglicherweise eine Ausnahme ausgelöst wurde. |
|
C#-Operatoren: C# unterstützt zusätzliche Operatoren, z. B. is und typeof. Darüber hinaus werden in dieser Sprache für einige logische Operatoren abweichende Funktionen eingeführt. |
|
Das typedef-Schlüsselwort. In C++ wird typedef zum Erstellen kürzerer und einfacherer Namen für Typen, die bereits deklariert wurden, verwendet. In C# stellt die using-Direktive diese Möglichkeit zur Verfügung. |
|
Das extern-Schlüsselwort: In C++ wird extern verwendet, um Typen zu importieren. In C# wird extern verwendet, um Aliase zu erstellen, damit verschiedene Versionen der gleichen Assembly verwendet werden können. |
|
Das static-Schlüsselwort: In C++ kann static verwendet werden, um sowohl Entitäten auf Klassenebene zu erstellen, als auch Typen zu deklarieren, die für ein Modul spezifisch sind. In C# wird static nur dazu verwendet, Entitäten auf Klassenebene zu deklarieren. |
|
Die Main-Methode in C# wird anders als die main-Funktion in C++ deklariert. In C# wird diese Methode großgeschrieben, und sie ist immer static. Außerdem ist die Unterstützung für die Verarbeitung von Befehlszeilenargumenten in C# viel robuster. |
|
Zeiger sind in C# nur im unsafe-Modus zulässig. |
|
Das Überladen von Operatoren erfolgt in C# auf andere Weise. |
|
Zeichenfolgen: Eine Zeichenfolge ist in C++ einfach ein Array von Zeichen. In C# ist eine Zeichenfolge ein Objekt, das stabile Suchmethoden unterstützt. |
|
Mit dem foreach-Schlüsselwort können Sie Arrays und Auflistungen durchlaufen. |
|
Globals: Globale Methoden und Variablen werden in C# nicht unterstützt. Methoden und Variablen müssen innerhalb einer class oder struct enthalten sein. |
|
Die #define-Präprozessordirektive: In C++ wird die #define-Direktive häufig zum Deklarieren konstanter Werte verwendet. In C# kann die #define-Direktive nicht für diesen Zweck verwendet werden. Definieren Sie Konstanten in C# als Enumerationstypen (nur ganzzahlige Werte) oder statische Member einer Klasse oder einer Struktur. Wenn Sie über mehrere solcher Konstanten verfügen, erwägen Sie, eine separate "Constants"-Klasse zu erstellen. |
|
Importieren von Typen: Typen, die in mehreren Modulen enthalten sind, werden in C++ in den Headerdateien gespeichert. In C# sind diese Informationen über Metadaten verfügbar. |
|
Lokale Variablen in C# können erst nach ihrer Initialisierung verwendet werden. |
|
Speicherverwaltung: C++ ist eine Sprache, die nicht über Garbage Collection verfügt. Arbeitsspeicher, der nicht explizit freigegeben wird, bleibt solange reserviert, bis der Prozess beendet ist. C# ist eine Sprache, die über Garbage Collection verfügt. |
|
Destruktoren: C# hat eine andere Syntax für das deterministische Freigeben von nicht verwalteten Ressourcen. |
|
Konstruktoren: Wenn Sie in C# keinen Klassenkonstruktor angeben, wird ähnlich wie in C++ automatisch ein Standardkonstruktor generiert. Dieser Standardkonstruktor initialisiert alle Felder mit den entsprechenden Standardwerten. |
|
C# unterstützt keine Bitfelder. |
|
Eingabe-/Ausgabedienste sowie die Formatierung in C# basieren auf der Laufzeitbibliothek von .NET Framework. |
|
Methodenparameter können in C# keine Standardwerte annehmen. Verwenden Sie Methodenüberladungen, um denselben Effekt zu erzielen. |
|
Generische Typen und Methoden sorgen in C# für eine Typparametrisierung auf eine Art, die der bei C++-Vorlagen sehr ähnlich ist. Es gibt jedoch wesentliche Unterschiede: Zum Beispiel werden in C# generische Typinformationen zur Laufzeit beibehalten. |
|
Das as-Schlüsselwort ist mit einer Standardumwandlung vergleichbar. Jedoch ist der Rückgabewert NULL, wenn die Umwandlung fehlschlägt, anstatt dass eine Ausnahme ausgelöst wird. Dies ist mit der Verwendung von static_cast in C++ vergleichbar, das im Gegensatz zu dynamic_cast zur Laufzeit keine Überprüfung durchführt und somit bei einem Fehler keine Ausnahme auslöst. |
Weitere Informationen über Vergleiche der Schlüsselwörter in C# und anderen Programmiersprachen finden Sie in Übereinstimmungen in verschiedenen Sprachen. Informationen über die allgemeine Struktur von C#-Anwendungen finden Sie unter Allgemeine Struktur eines C#-Programms (C#-Programmierhandbuch).
Hinweis: