1. Introduction
Structure — c'est un type de données spécial en C# qui te permet de regrouper plusieurs valeurs (même de types différents) dans une seule "boîte". C'est un peu comme un mini set de LEGO : tu assembles les pièces et au final tu obtiens un objet pratique et compact.
Les structures ressemblent aux classes, mais elles ont leurs propres particularités, et on les utilise pour des cas plus "simples", quand t'as pas besoin de toute la puissance et la "lourdeur" des classes.
Syntaxe
struct Point
{
public int X;
public int Y;
}
Dans cet exemple, on a décrit une structure pour un point sur un plan avec les coordonnées X et Y.
Où on utilise les structures ?
Le plus souvent, on utilise les structures pour des petits objets simples qui doivent être super légers et "juste des données".
En C#, certains types standards sont des structures :
- int, double, bool, DateTime, TimeSpan, decimal, Guid
- et même, par exemple, ConsoleKeyInfo ou Point (dans les bibliothèques graphiques)
Différences entre structures et classes
| Critère | Structure | Classe |
|---|---|---|
| Mot-clé | |
|
| Type de stockage | Value Type | Reference Type |
| Stocké dans | La pile (zone mémoire) | Le tas (zone mémoire) |
| Passage en méthode | Par valeur (copie) | Par référence |
| Héritage | Non (sauf interfaces) | Oui |
| Peut être null | Non (seulement Nullable) | Oui |
| Par défaut | Initialisation implicite de tous les champs à zéro | Seulement via le constructeur |
2. Déclaration et utilisation des structures
Tu peux déclarer une structure à l'intérieur ou à l'extérieur d'une classe :
struct Rectangle
{
public int Width;
public int Height;
}
Création et utilisation :
Rectangle r;
r.Width = 10;
r.Height = 5;
Console.WriteLine($"Surface : {r.Width * r.Height}");
Tu peux aussi utiliser un constructeur :
struct Point
{
public int X;
public int Y;
// Constructeur
public Point(int x, int y)
{
X = x;
Y = y;
}
}
var p = new Point(3, 7);
Console.WriteLine($"Point : ({p.X}, {p.Y})");
Quand c'est mieux d'utiliser une structure ?
- Pour des petits "paquets" de données (genre coordonnées, couleur, intervalle, date et heure).
- Quand la compacité et la perf sont importantes (genre des millions de points dans un tableau).
- Quand l'objet doit se comporter comme une seule valeur (copy-paste — c'est vraiment une copie !).
Faut pas utiliser une structure si l'objet :
- Peut être gros (beaucoup de champs).
- Doit faire partie d'une hiérarchie d'héritage.
- Doit souvent être modifié par référence.
3. Particularités et "pièges" des structures
Copie
Point p1 = new Point(1, 2);
Point p2 = p1; // on crée une COPIE !
p2.X = 100;
Console.WriteLine(p1.X); // 1 — n'a pas changé !
Console.WriteLine(p2.X); // 100
Valeurs implicites par défaut
Point p; // les champs X et Y = 0, même si t'as rien assigné !
Peut être Nullable
Pour stocker null, il faut utiliser la syntaxe spéciale nullable — tu mets un point d'interrogation après le nom du type. Comme ça, tu pourras assigner null à la variable.
Point? p = null;
if (p == null)
Console.WriteLine("Pas de point");
4. Structures avec propriétés automatiques et méthodes
Les structures peuvent avoir des méthodes, des propriétés, des événements et même des membres statiques.
public struct Range
{
public int Start { get; set; }
public int End { get; set; }
public int Length => End - Start;
public override string ToString() => $"[{Start}..{End}]";
}
Exemple : structure pour les nombres complexes
Structure pour les nombres complexes avec une méthode et override de ToString()
struct Complex
{
public double Re;
public double Im;
public Complex(double re, double im)
{
Re = re;
Im = im;
}
public double Abs() => Math.Sqrt(Re * Re + Im * Im);
public override string ToString() => $"{Re} + {Im}i";
}
var z = new Complex(1, 2);
Console.WriteLine(z); // 1 + 2i
Console.WriteLine(z.Abs()); // 2.236...
GO TO FULL VERSION