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).

Klasse

Schnittstelle

struct (C#-Referenz)

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.

Arrays (C#-Programmierhandbuch)

Indexer (C#-Programmierhandbuch)

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.

bool

Der long-Typ: In C# umfasst der Datentyp long 64 Bits, während er in C++ 32 Bits umfasst.

long

Ü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.

struct

Klasse

ref (C#-Referenz)

out (C#-Referenz)

Die switch-Anweisung: Im Unterschied zur switch-Anweisung von C++ unterstützt C# kein Fortfahren von einer case-Bezeichnung zur nächsten.

switch

Delegaten: C#-Delegaten entsprechen weitestgehend den Funktionszeigern in C++, und sie sind typsicher und geschützt.

Delegat

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.

base

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.

new

Präprozessordirektiven werden für die bedingte Kompilierung benötigt. In C# werden keine Headerdateien verwendet.

C#-Präprozessordirektiven

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.

try-finally

try-catch-finally

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.

Operator &

Operator |

Operator ^

is

typeof

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.

using-Direktive (C#-Referenz)

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.

extern

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.

static

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.

Main() und Befehlszeilenargumente (C#-Programmierhandbuch)

Zeiger sind in C# nur im unsafe-Modus zulässig.

unsafe

Das Überladen von Operatoren erfolgt in C# auf andere Weise.

C#-Operatoren

Zeichenfolgen: Eine Zeichenfolge ist in C++ einfach ein Array von Zeichen. In C# ist eine Zeichenfolge ein Objekt, das stabile Suchmethoden unterstützt.

string

String

Mit dem foreach-Schlüsselwort können Sie Arrays und Auflistungen durchlaufen.

foreach, in

Globals: Globale Methoden und Variablen werden in C# nicht unterstützt. Methoden und Variablen müssen innerhalb einer class oder struct enthalten sein.

Allgemeine Struktur eines C#-Programms

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.

static (C#-Referenz)

const (C#-Referenz)

enum (C#-Referenz)

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.

using

Metadatenübersicht

Lokale Variablen in C# können erst nach ihrer Initialisierung verwendet werden.

Methoden (C#-Programmierhandbuch)

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.

Garbage Collection

Destruktoren: C# hat eine andere Syntax für das deterministische Freigeben von nicht verwalteten Ressourcen.

Destruktoren

using-Anweisung (C#-Referenz)

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.

Instanzkonstruktoren

Tabelle für Standardwerte

C# unterstützt keine Bitfelder.

Bitfelder in C++

Eingabe-/Ausgabedienste sowie die Formatierung in C# basieren auf der Laufzeitbibliothek von .NET Framework.

Tour durch die C#-Sprache

Tabelle zur Formatierung numerischer Ergebnisse

Methodenparameter können in C# keine Standardwerte annehmen. Verwenden Sie Methodenüberladungen, um denselben Effekt zu erzielen.

Compilerfehler CS0241

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.

Generika in C#

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.

as (C#-Referenz)

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).

Siehe auch

Konzepte

C#-Programmierhandbuch

Elementverwaltung in Projekten

Verwenden des Projektmappen-Explorers