Migrer du C++ au C# |
Mis à jour le 27/11/2002
Par Leduke
Droit de
diffusion: Certaines parties de cet article sont extraites de l'article : "C++ -> C#: What You Need to Know to Move from C++ to C#" de Jesse Liberty. Avant
Propos :
Sommaire:
Introduction
IntroductionLe langage C# s'appuit sur la syntaxe et la sémantique du C++, permettant au programmeur C de bénéficier des avantages de .NET et de la Common Language Runtime. Alors que la transition du C++ vers le C# peut paraître aisée, il y a un certain nombre d'éléments qui ont changé que nous allons étudier tels que l'opérateur new, les structures, les constructeurs, les destructeurs.
1. PiègesLe langage C# ressemble à s'y méprendre au C++. Il se peut que vous écriviez du code qui est parfaitement correct en C++ mais qui ne compile pas en C# ou au pire ne se comporte pas à l'exécution comme vous l'attendiez. La plupart des différences syntaxiques entre le C++ et le C# sont triviales (pas de point virgule après la déclaration d'une classe, Main comporte désormais une majuscule) et sont détectées par le compilateur. 2. Les principales différences entre le C++ et le C#
3. Les types de valeur et de référenceLe C# distingue les types de valeur (value) des types de référence (reference). Les types simples (int, long, double ...) et les structures sont des types de valeurs alors que les classes sont des types de référence tout comme les objets. Les types value représentent la donnée réelle stockée sur la pile et sont passés aux méthodes par valeur (une copie est réalisée). Les types reference contiennent l'adresse d'un objet stocké sur le tas et sont passés en paramètre par référence.
4. Les structuresLes structures sont différentes en C#. En C++ les structures sont exactement comme une classe, sauf que l'héritage et l'accès par défaut est public et non privé. En C# les structures sont conçues pour encapsuler de petits objets et sont de type value (donc passées par valeur). Elles sont limitées dans la mesure où elles ne peuvent dériver d'aucune classe sauf System.ValueType et qu'elles ne peuvent pas définir de constructeur par défaut (sans paramètres). En contre partie l'utilisation d'une structure est préférable à celui d'une classe pour de trés petits objets. 5. Tout dérive de la classe ObjectEn C# finalement tout dérive de la classe Object aussi bien les classes que vous créez que les types de valeurs (int, struct ...). La classe Object présente des méthodes utiles comme la méthode ToString. Prenons un exemple d'utilisation de la méthode ToString et de la méthode System.Console.WriteLine (équivalent du cout en C++). Considérons un objet myEmployee comme instance de l'objet Employee et un objet myCounter comme instance de l'objet Counter. Si nous écrivons le code suivant :
La méthode WriteLine va appeler la méthode virtuelle Objet.ToString de chacun de ces objets et substituer les chaînes que les paramètres vont retourner. Si la classe Employee ne surcharge pas la méthode ToString l'implémentation par défaut sera appelée laquelle retourne le nom de la classe. La classe Counter va surcharger la méthode ToString afin de retourner un entier ce qui produit à l'exécution le résultat suivant :
Que se passe-t-il si l'on transmet à la méthode WriteLine un entier ? Il n'est pas possible d'appeler la méthode ToString sur un entier mais le compilateur va implicitement transformer l'entier en une instance de l'objet Object dont la valeur sera celle de l'entier. Cette transformation porte le terme de boxing. Vous trouverez ci-joint l'exemple complet.
6. La gestion des paramètres des prototypes
de fonctions
En C# comme en C++ une méthode ne peut avoir qu'une seule valeur en retour. Pour pallier à cette limitation en C++ les paramètres sont passés par références ou via des pointeurs. La méthode appelée change la valeur des paramètres et les rend accessibles à la méthode appelante. En C# quand vous passez une référence à une méthode vous avez accès à l'objet d'origine, comme en C++ avec le passage par référence ou les pointeurs. En revanche cela ne fonctionne pas avec les types de valeurs. Si vous souhaitez passer un type de valeur par reference alors il faut le faire précéder du mot clé ref.
Il est important de préciser que le mot réservé ref doit être utilisé aussi bien dans la déclaration de la méthode que dans la méthode appelante.
Vous pouvez maintenant déclarer les champs age,ID,yearsServed dans la méthode appelante et les passer à la méthode GetStats et récupérer les valeurs modifiées en retour. En C# il est nécessaire d'initialiser les variables avant de les passer à la méthode GetStats (definite assignment). Il est possible d'éviter cette initialisation en utilisant le mot clé out. En utilisant le mot clé out en C#, vous indiquez que la variable n'est pas initialisée et qu'elle est passée par référence.
Comme lors de l'utilisation du mot clé ref, le mot clé out doit être utilisé aussi bien dans la déclaration de la méthode que dans la méthode appelante.
7. Le mot clé "new"En C++, le mot clé New instancie un objet sur le tas. Le langage C# fait de même avec les types de reference. Pour les types de valeurs comme les structures, l'objet est créé sur la pile et un constructeur est appelé. Vous pouvez aussi créer une structure sur la pile sans utiliser le mot clé New, mais attention car New initialise l'objet. Ce qui veut dire que toutes les valeurs de structure doivent être initialisées à la main (avant le passage à une méthode).
8. Les propriétésEn C++, les programmeurs essaient de garder les variables membres privées. C'est le principe même de l'encapsulation qui permet de modifier l'implémentation d'une classe sans en changer l'interface. Concrètement, le développeur C++ va créer des accesseurs permettant de modifier les valeurs de variables membres privées. En C#, les propriétés sont les premiers membres d'une classe. Pour un client, une propriété ressemble à une variable membre mais pour le développeur de la classe il s'agit plutôt d'une méthode. Les propriétés favorisent l'encapsulation et offrent au client un accès facilité aux membres de la classe. Par exemple considérons une classe Employee avec une propriété Age permettant à un client de valoriser ou d'extraire l'age d'une employé.
Le mot clé value est défini implicitement au travers de la propriété. Si vous écrivez
le compilateur va attribuer à value la valeur 17. Il est possible d'implémenter une propriété en lecture seule, il suffit de ne pas implémenter d'accesseur Set .
9. Les tableauxLe C# propose une classe de gestion des tableaux plus complète que le tableau traditionnel C/C++. Par exemple, il est impossible d'écrire en dehors des limites d'un tableau. De plus C# propose une classe ArrayList dont la taille peut grossir dynamiquement en fonction des besoins du programme. Il existe trois types de tableaux : unidimensionnel, multidimensionnel et des tableaux de tableaux (jagged array). Vous pouvez créer un tableau à une dimension de la manière suivante :
ou l'initialiser ainsi :
Vous pouvez créer un tableau à deux dimensions de la manière suivante :
ou l'initialiser ainsi :
Comme les jagged array sont des tableaux de tableaux il est nécessaire de fournir uniquement une seule dimension.
et ensuite de créér chacun des tableaux internes :
Parce que les tableaux dérivent de l'objet System.Array, ils disposent de nombreuses méthodes parmis lesquelles Sort et Reverse .
A travers cet article nous avons abordé les principales différences entre le C# et le C++. Il en ressort que le passage au C# pour un développeur C++ expérimenté devrait se faire sans trop de difficultés la syntaxe se rapprochant beaucoup entre ces deux langages. Attention toutefois à ne pas tomber dans la facilité et à programmer en C# comme vous le feriez en C++ au risque d'avoir des comportements inattendus. Remarque
: Document réalisé par Leduke | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||