6. Types de données de base et passage de paramètres
Les types de données de base dérivent directement des types de données Java, qui conservent également le nom, y compris la conversion des types de données, ce que l’on appelle «casting» fonctionne de la même manière que Java. Au contraire, en ce qui concerne les types de données définies par l’utilisateur il y a des nouveautés introduites par le langage C# : struct et enum.
Le type struct permet de définir de nouveaux types de données à partir des données existantes :
public struct Personne { public string Nom; public string Prenom; }
Cette déclaration définit un type de données de Personne composé de deux variables de type chaîne (les membres de la structure). Nous notons que, contrairement à C++, dont le concept de struct dérive, chaque membre doit avoir un modificateur d’accès (public, private, etc.).
C’est parce que le type struct est très puissant : il peut être équipé d’un constructeur (qui se comporte exactement comme un constructeur d’une classe), d’une propriété et de méthodes. Modifions la structure Personne en ajoutant un constructeur et une propriété qui retourne le nom complet, donc reprenons notre premier programme et mettons-le à jour pour montrer l’utilisation de struct :
public class HelloWorld { public struct Personne { public string Prenom; public string Nom; public Personne(string Prenom, string Nom) { this.Prenom = Prenom; this.Nom = Nom; } public string NomComplet { get { return Prenom + ” ” + Nom; } } } public static void Main() { Personne p = new Personne(“Luca”, “Dilaurentis”); System.Console.WriteLine(“Bonjour ” + p.NomComplet + “!”); System.Console.ReadLine(); } }
Dans la méthode Main, la structure Personne est utilisée comme s’il s’agissait d’une classe. Notons qu’au lieu d’utiliser le constructeur, on pourrait écrire :
Personne p; p.Prenom = “Luca”; p.Nom = “Dilaurentis”;
Obtenir le même résultat, c’est-à-dire le message « Bonjour Luca Dilaurentis !« . Ceci est possible parce que les membres Nom et Prenom de la structure ont été déclarés public ; si, au contraire, on les déclare private, on ne serait pas autorisé à utiliser les trois étapes ci-dessus (vous auriez eu une erreur au moment de la compilation, comme déjà expliqué dans l’article dédié aux classes), et la seule façon possible de définir le nom des membres et le nom de famille aurait été d’utiliser le constructeur.
Cliquez ici pour télécharger l’exemple.
À ce stade, il est naturel de se demander quelles sont les différences entre struct et class. L’explication est fournie le guide en ligne: « Le type struct convient pour l’affichage des objets légers […] Par exemple, si vous déclarez un tableau de 1000 objets [classes] Point, il faudra de la mémoire supplémentaire pour les références de chaque objet. Dans ce cas, la structure est moins lourde. » Une structure peut également implémenter des interfaces mais elle ne peut pas hériter.
Enum permet d’associer des noms symboliques avec des constantes numériques. Le construct vient du C++ où les membres de l’enum sont toujours de type ‘int’, tandis qu’en C# vous pouvez explicitement indiquer le type :
public enum Etats : byte { France, Italie, Amerique, Angleterre //,… }
Cette instruction définit une énumération dont les membres sont des octets. En appelant la méthode ToString() d’une variable de type enum, vous pouvez obtenir la chaîne contenant le nom symbolique de la valeur en cours. Par exemple :
Etats s = Etats.Amerique; System.Console.WriteLine(“État sélectionné : ” + s.ToString());
Ce code imprime le message « État sélectionné : Amérique ».
Le passage des paramètres aux méthodes
Nous terminons cette leçon par un clin d’œil sur le passage des paramètres aux méthodes. Les paramètres du C# peuvent être transmis de trois façons : in, out et ref.
Ces mots-clés déterminent ce qui arrive à la variable passée en tant qu’argument lorsque vous quittez la méthode.
- in est le type de passage par défaut : la routine ne peut pas changer la variable, ou, mieux, tout changement de la variable interne à la méthode est perdue quand on sort de son champ d’application, scope (le typique passage « par la valeur »).
- ref et out sont les étapes de paramètres classiques pour la référence. La référence (pointeur) est transmise à la variable et non à sa valeur, de même dans le scope de la méthode on fait référence au même objet en mémoire.
La différence entre ref et out est que ref nécessite que la variable soit initialisée avant l’appel de la méthode, alors qu’avec out il suffit de déclarer la variable et de la passer sans initialisation. En pratique, avec out, vous pouvez initialiser des structures données à l’intérieur d’une méthode.
Regardons quelques exemples simples pour clarifier ce qui est montré :
// Sauf indication contraire, le paramètre est de type «in» public void Calcule(int N){ N = 10; } public void CalculeOut(out int N){ N = 10; } public void CalculeRef(ref int N){ N += 1; }
Une utilisation possible de ces méthodes est la suivante :
int i = 7; Calcule(i); // A la sortie, i vaut toujours 7
int i = 7; CalculeRef(ref i); //A sa sortie, i vaut i + 1 = 8
// i est seulement déclaré et non initialisé int i; // on la passe sur «out» CalculeOut(out i);
Notez que pour utiliser un paramètre out ou ref en appelant une méthode, vous devez indiquer explicitement s’il s’agit d’un argument passé out ou ref.
Précédent : 5. Méthodes statiques et namespaces Suivant : 7. String Interpolation en C#, concaténer des chaînes
Étiquette :données, enum, in, out, paramètres, ref, struct, Structure du langage