Programmation C sharp/Structures et énumérations
Structure
modifierUne 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
modifierstruct nom_de_structure { type variable; }
Exemple :
struct Point
{
public double x;
public double y;
}
Méthodes
modifierComme 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
modifierIl 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 valoirnull
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
modifierLe 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
ouout
), manière recommandée avec les structures car seule une adresse est passée.
Énumération
modifierUne énumération est un type de données dont les valeurs sont des constantes nommées.
Syntaxe
modifierenum nom_énumération { nom, nom ... };
Exemple :
enum JourDeSemaine
{ LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE };
Type des constantes
modifierLes 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
modifierEn 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");