C# pour les développeurs C++
Mise à jour : novembre 2007
Le tableau suivant fait d'importantes comparaisons entre C# et C++ natif, qui n'utilise pas /clr. Si vous programmez en C++, ce tableau vous permettra d'identifier d'un seul coup d'œil les principales différences entre ces deux langages.
Remarque : |
---|
Les projets C++ et C# sont dérivés de modèles de projets différents. Pour plus d'informations sur les différences entre les projets C++ et C#, consultez Gestion des éléments dans les projets et Utilisation de l'Explorateur de solutions. |
Fonctionnalité |
Rubrique à consulter |
---|---|
Héritage : En C++, les classes et structures sont pratiquement identiques alors qu'en C#, elles sont assez différentes. Une classe C# peut implémenter n'importe quel nombre d'interfaces, mais elle ne peut hériter que d'une seule classe de base. En outre, les structures C# ne prennent en charge ni l'héritage ni des constructeurs par défaut explicites (elles en fournissent un par défaut). |
|
Tableaux : En C++, un tableau est simplement un pointeur. En C#, les tableaux sont des objets qui incluent des méthodes et des propriétés. Par exemple, la taille d'un tableau peut être interrogée via la propriété Length. En C#, des indexeurs vérifient chaque index utilisé pour accéder à un tableau. La syntaxe de déclaration de tableaux C# est différente de celle de tableaux C++ : les jetons "[]" apparaissent à la suite du type de tableau en C#, et non la variable. |
|
Booléens : En C++, le type bool est essentiellement un entier. En langage C#, il n'y a pas de conversion possible entre le type bool et les autres types. |
|
Type long : en C#, le type long équivaut à 64 bits, alors qu'en C++, il correspond à 32 bits. |
|
Passage de paramètres : En C++, toutes les variables sont passées par valeur, sauf si elles sont explicitement passées avec un pointeur ou une référence. En C#, les classes sont passées par référence et les structures sont passées par valeur si elles ne sont pas explicitement passées par référence avec les modificateurs de paramètres ref ou out. |
|
Instruction switch : contrairement à l'instruction switch du C++, celle du C# ne prend pas en charge l'exécution en cascade des étiquettes case. |
|
Délégués : Les délégués en C# sont à peu près similaires aux pointeurs fonction en C++, mais ils sont sécurisés et fiables. |
|
Méthodes de classe de base : C# prend en charge le mot clé base pour appeler les membres de la classe de base substitués de classes dérivées. La substitution de méthodes virtuelles ou abstraites est explicite en C#, avec le mot clé override. |
Voir aussi les exemples fournis pour override |
Masquage de méthode : C++ prend en charge le « masquage » implicite d'une méthode par héritage. En C#, vous devez utiliser le modificateur new pour masquer explicitement un membre hérité. |
|
Les directives de préprocesseur sont utilisées pour la compilation conditionnelle. C# n'utilise pas de fichier d'en-tête. |
|
Gestion des exceptions : C# fournit le mot clé finally qui fournit le code à exécuter indépendamment de la levée ou non d'une exception. |
|
Opérateurs C# : C# prend en charge des opérateurs supplémentaires tels que is et typeof. Il introduit également des fonctionnalités différentes pour certains opérateurs logiques. |
|
Le mot clé typedef. En C++, typedef est utilisé pour créer des noms plus courts ou plus commodes pour les types qui ont déjà été déclarés. En C#, la directive using fournit cette fonctionnalité. |
|
Mot clé extern : En C++, extern est utilisé pour importer des types. En C#, extern crée des alias pour utiliser des versions différentes du même assembly. |
|
Mot clé static : En C++, static peut être utilisé pour déclarer des entités de niveau classe et des types spécifiques à un module. En C#, static ne sert qu'à déclarer des entités de niveau classe. |
|
La méthode Main en C# est déclarée différemment de la fonction main en C++. En C#, elle est toujours en majuscules et static. La prise en charge d'arguments de ligne de commande est également beaucoup plus fiable en C#. |
Main() et arguments de ligne de commande (Guide de programmation C#) |
Les pointeurs sont autorisés en C# mais uniquement en mode unsafe. |
|
La surcharge d'opérateurs est effectuée différemment en C#. |
|
Chaînes : En C++, une chaîne est simplement un tableau de caractères. En C#, les chaînes sont des objets qui prennent en charge des méthodes de recherche fiables. |
|
Le mot clé foreach permet de parcourir les tableaux et collections. |
|
Globales : En C#, les méthodes et variables globales ne sont pas prises en charge. Les méthodes et variables doivent être contenues dans une class ou struct. |
|
La directive de préprocesseur #define : en C++, la directive #define est couramment utilisée pour déclarer des valeurs constantes. En C#, la directive #define ne peut pas être utilisée à cette fin. Il vaut mieux définir les constantes C# comme types énumérés (valeurs entières uniquement) ou comme membres statiques d'une classe ou d'un struct. Si vous avez plusieurs constantes de ce type, envisagez de créer une classe « Constants » distincte pour les stocker. |
|
Importation de types : En C++, les types communs à plusieurs modules sont placés dans des fichiers d'en-tête. En C#, ces informations sont disponibles via des métadonnées. |
|
En C#, les variables locales doivent être initialisées avant de pouvoir être utilisées. |
|
Gestion de la mémoire : C++ n'est pas un langage avec garbage collection ; la mémoire qui n'est pas explicitement libérée reste allouée tant que le processus n'est pas terminé. C# est un langage avec garbage collection. |
|
Destructeurs : C# a une syntaxe différente pour libérer des ressources non managées de façon déterministe. |
|
Constructeurs : comme dans du code C++, si vous ne fournissez pas un constructeur de classe en C#, un constructeur par défaut est généré automatiquement. Le constructeur par défaut initialise tous les champs en leur attribuant leurs valeurs par défaut. |
|
C# ne prend pas en charge les champs de bits. |
|
En C#, les services d'entrée/sortie et l'application de formats font appel à la bibliothèque Runtime du .NET Framework. |
|
En C#, les paramètres des méthodes ne peuvent pas avoir des valeurs par défaut. Utilisez les surcharges de méthode si vous souhaitez obtenir le même résultat. |
|
En C#, les types et méthodes génériques assurent le paramétrage de type d'une manière similaire aux modèles C++. Il existe toutefois des différences notables. Par exemple, en C#, les informations de type générique sont conservées au moment de l'exécution. |
|
Le mot clé as est semblable à un cast standard, mais au lieu de lever une exception si la conversion échoue, la valeur de retour est Null. Cela est semblable à l'utilisation de static_cast en C++ qui, contrairement à dynamic_cast, n'exécute aucun contrôle d'exécution et, par conséquent, ne lève pas d'exception en cas d'échec. |
Pour plus d'informations sur les comparaisons dans les mots clés entre C# et d'autres langages de programmation, consultez Language Equivalents. Pour plus d'informations sur la structure générale des applications C#, consultez Structure générale d'un programme C# (Guide de programmation C#).