C# für C++-Entwickler
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).