Partager via


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

classe

interface

struct (Référence C#)

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.

Tableaux (Guide de programmation C#)

Indexeurs (Guide de programmation C#)

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.

bool

Type long : en C#, le type long équivaut à 64 bits, alors qu'en C++, il correspond à 32 bits.

long

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.

struct

classe

ref (Référence C#)

out (Référence C#)

Instruction switch : contrairement à l'instruction switch du C++, celle du C# ne prend pas en charge l'exécution en cascade des étiquettes case.

switch

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.

délégué

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.

base

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

new

Les directives de préprocesseur sont utilisées pour la compilation conditionnelle. C# n'utilise pas de fichier d'en-tête.

Directives de préprocesseur C#

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.

try-finally

try-catch-finally

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.

&, opérateur

|, opérateur

^, opérateur

is

typeof

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

using, directive (Référence C#)

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.

extern

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.

static

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.

unsafe

La surcharge d'opérateurs est effectuée différemment en C#.

Opérateurs 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.

chaîne

String

Le mot clé foreach permet de parcourir les tableaux et collections.

foreach, in

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.

Structure générale d'un programme C#

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.

static (Référence C#)

const (Référence C#)

enum (Référence C#)

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.

using

Vue d'ensemble des métadonnées

En C#, les variables locales doivent être initialisées avant de pouvoir être utilisées.

Méthodes (Guide de programmation C#)

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.

Garbage collection

Destructeurs : C# a une syntaxe différente pour libérer des ressources non managées de façon déterministe.

Destructeurs

using, instruction (Référence C#)

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.

Constructeurs d'instances

Tableau des valeurs par défaut

C# ne prend pas en charge les champs de bits.

Champs de bits C++

En C#, les services d'entrée/sortie et l'application de formats font appel à la bibliothèque Runtime du .NET Framework.

Visite guidée du langage C#

Tableau des formats des résultats numériques

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.

Erreur du compilateur CS0241

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.

Classes génériques en C#

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.

as (Référence C#)

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

Voir aussi

Concepts

Guide de programmation C#

Gestion des éléments dans les projets

Utilisation de l'Explorateur de solutions