Pour créer une structure, nous utiliserons le mot-clé
struct, comme nous avions utilisé le mot-clé
class pour créer une classe :
Code : C# | public struct Personne
{
public string Prenom { get; set; }
public int Age { get; set; }
}
|
Pour instancier cette structure, nous pourrons utiliser le mot-clé
new, comme pour les classes. La différence est que la variable sera un type valeur, avec les conséquences que ce type impose en matière de gestion en mémoire ou de passages par paramètres :
Code : C# | Personne nicolas = new Personne() { Prenom = "Nicolas", Age = 30 };
Console.WriteLine(nicolas.Prenom + " a " + nicolas.Age + " ans");
|
Comme nous avons dit, il est impossible qu’une structure hérite d’une autre structure ou d’un objet. Sauf bien sûr du fameux type de base
object, pour qui c’est automatique. Une structure hérite donc des quelques méthodes d’
Object (comme
ToString()) que nous pouvons éventuellement spécialiser :
Code : C# | public struct Personne
{
public string Prenom { get; set; }
public int Age { get; set; }
public override string ToString()
{
return Prenom + " a " + Age + " ans";
}
}
|
Et nous pourrons avoir :
Code : C# | Personne nicolas = new Personne() { Prenom = "Nicolas", Age = 30 };
Console.WriteLine(nicolas.ToString());
|
Qui renverra :
Code : Console
Comme pour les classes, il est possible d’avoir des constructeurs sur une structure à l’exception du constructeur par défaut qui est interdit.
Aussi le code suivant :
Code : C# | public struct Personne
{
public Personne()
{
}
}
|
provoquera l’erreur de compilation suivante :
Code : Console | Les structures ne peuvent pas contenir de constructeurs exempts de paramètres explicites |
Par contre, les autres formes des constructeurs sont possibles, comme :
Code : C# | public struct Personne
{
private int age;
public Personne(int agePersonne)
{
age = agePersonne;
}
}
|
Qui s’utilisera comme pour une classe :
Code : C# | Personne nicolas = new Personne(30);
|
Attention, si vous tentez d’utiliser des propriétés ou des méthodes dans le constructeur d’une structure, vous allez avoir un problème.
Par exemple le code suivant :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13 | public struct Personne
{
private int age;
public Personne(int agePersonne)
{
AffecteAge(agePersonne);
}
private void AffecteAge(int agePersonne)
{
age = agePersonne;
}
}
|
provoquera les erreurs de compilation suivantes :
Code : Console | L'objet 'this' ne peut pas être utilisé avant que tous ses champs soient assignés
Le champ 'MaPremiereApplication.Personne.age' doit être totalement assigné avant que le contrôle soit retourné à l'appelant |
Alors qu’avec une classe, ce code serait tout à fait correct.
Pour corriger ceci, il faut absolument initialiser tous les champs avant de faire quoi que ce soit avec l’objet, comme l’indique l’erreur.
Nous pourrons par exemple faire :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | public struct Personne
{
private int age;
public Personne(int agePersonne)
{
age = 0;
AffecteAge(agePersonne);
}
private void AffecteAge(int agePersonne)
{
age = agePersonne;
}
}
|
Ce qui peut sembler tout à fait inutile dans ce cas-là. Mais comme le compilateur fait certaines vérifications, il sera impossible de compiler un code de ce genre sans que toutes les variables soient initialisées explicitement.
Par contre, vous aurez un souci si vous utilisez des propriétés automatiques. Si nous tentons de faire :
Code : C# | public struct Personne
{
public int Age { get; set; }
public Personne(int agePersonne)
{
Age = agePersonne;
}
}
|
nous nous retrouverons avec la même erreur de compilation.
Pour la corriger, il faudra appeler le constructeur par défaut de la structure qui va permettre d’initialiser toutes les variables de la classe :
Code : C# | public struct Personne
{
public int Age { get; set; }
public Personne(int agePersonne) : this()
{
Age = agePersonne;
}
}
|
Cela se fait comme pour les classes, en utilisant le mot-clé
this suivi de parenthèses qui permettront d’appeler le constructeur par défaut.
Rappelez-vous que le constructeur par défaut s’occupe d’initialiser toutes les variables d’une classe ou d’une structure.