Programmation C sharp/Structures et énumérations

Programmation C#
Programmation C#
Modifier ce modèle

Structure

modifier

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
struct nom_de_structure
{
    type variable;
}

Exemple :

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

Méthodes

modifier

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

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

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 adresse est passée.

Énumération

modifier

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

Syntaxe

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

Exemple :

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

Type des constantes

modifier

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

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");