Programmation C sharp/Structures et énumérations

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche
Programmation C#
Programmation C#
Sommaire
Le langage
Programmation avancée
API .Net
Ressources
Modifier ce modèle

Structure[modifier | modifier le wikicode]

Une structure rassemble plusieurs champs (des variables) en un seul type. Déclarer une variable de ce type revient à allouer de la place pour tous les champs déclarés.

Syntaxe[modifier | modifier le wikicode]

struct nom_de_structure
{
    type variable;
}

Exemple :

struct Point
{
    public double x;
    public double y;
}

Méthodes[modifier | modifier le wikicode]

Comme pour une classe, il est possible d'ajouter des méthodes.

Exemple :

struct Point
{
    public double x;
    public double y;
    public void MoveTo(double x,double y)
    { this.x=x; this.y=y; }
}

Différences avec les classes[modifier | modifier le wikicode]

Il est possible d'assimiler les structures à des classes, cependant des différences existent :

  • Une structure ne peut hériter d'une autre, ou d'une classe ;
  • Les membres sont publics par défaut ;
  • Une instance de structure n'est pas une référence mais l'espace occupé par ses champs, par conséquent, l'opérateur new n'est pas utilisable, et une structure ne peut valoir null car allouée à la déclaration.

Exemple pour illustrer ce dernier point :

Point origine;   // alloué en mémoire à la déclaration
origine.x = 0.0;
origine.y = 0.0;

Passage d'une structure en paramètre[modifier | modifier le wikicode]

Le passage d'une structure en paramètre d'une fonction peut se faire de deux manières :

  • Par valeur, dans ce cas tous les champs de la structure sont passés dans la pile, ce qui peut prendre beaucoup de temps et de mémoire, voire causer un débordement de pile ;
  • Par référence (ref ou out), manière recommandée avec les structures car seule une addresse est passée.

Énumération[modifier | modifier le wikicode]

Une énumération est un type de données dont les valeurs sont des constantes nommées.

Syntaxe[modifier | modifier le wikicode]

enum nom_énumération
{
    nom, nom ...
};

Exemple :

enum JourDeSemaine
{ LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE };

Type des constantes[modifier | modifier le wikicode]

Les constantes d'une énumération sont par défaut des entiers (int) dont la valeur augmente de un, en commançant par zéro.

Ce qui veut dire que dans l'exemple précédent, LUNDI vaut 0, MARDI vaut 1, etc. Une constante peut être convertie en entier :

Console.WriteLine("Lundi : "+JourDeSemaine.LUNDI);
// affiche    Lundi : LUNDI

Console.WriteLine("Lundi : "+(int)JourDeSemaine.LUNDI);
// affiche    Lundi : 0

Il est possible de modifier les valeurs affectées aux constantes :

enum JourDeSemaine
{ LUNDI=1, MARDI=2, MERCREDI=3, JEUDI=4, VENDREDI=5, SAMEDI=6, DIMANCHE=7 };

Par défaut, chaque constante est associée à la valeur immédiatement supérieur à celle de la constante précédente. L'exemple précédent peut donc également s'écrire :

enum JourDeSemaine
{ LUNDI=1, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE };

Il est également possible de modifier le type des constantes :

enum JourDeSemaine : long
{ LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE };

Combinaison de constantes[modifier | modifier le wikicode]

En affectant des valeurs différentes de puissances de 2 aux constantes, l'opérateur ou ( | ) est utilisable pour combiner plusieurs constantes.

Exemple :

[Flags]
enum Droits
{
    LECTURE = 1,
    ECRITURE = 2,
    EFFACER = 4
};
Droits d = Droits.LECTURE | Droits.EFFACER;

Console.WriteLine("droits : "+d);
// affiche    droits : LECTURE, EFFACER

Console.WriteLine("droits : "+(int)d);
// affiche    droits : 5

L'attribut Flags indique au compilateur que plusieurs constantes peuvent être combinées. La méthode ToString de cet enum affiche alors toutes les constantes utilisées.

L'opérateur et ( & ) permet de tester si une constante appartient à l'ensemble :

if ( (d & Droits.LECTURE) != 0) Console.WriteLine("  lecture autorisée");
if ( (d & Droits.ECRITURE) != 0) Console.WriteLine("  écriture autorisée");