Avant de détailler leurs différences, il est essentiel de comprendre leur définition respective.
Un : Les Structures
1. Définition :
En C#, une structure est un type de données par valeur qui permet à une seule variable de stocker des données liées de types variés. Le mot-clé struct est utilisé pour créer des structures. Elles servent à encapsuler plusieurs variables de types différents.
Exemple : Vous pouvez déclarer une structure appelée Livre comme suit :
struct Ouvrage
{
public string titre;
public string auteur;
public string sujet;
public int idOuvrage;
}
Voici un programme démontrant l'utilisation d'une structure :
using System;
struct Ouvrage
{
public string titre;
public string auteur;
public string sujet;
public int idOuvrage;
}
public class TestStructure
{
public static void Main(string[] args)
{
Ouvrage livre1; // Déclaration d'un ouvrage
Ouvrage livre2; // Déclaration d'un second ouvrage
// Détails du premier livre
livre1.titre = "Programmation en C";
livre1.auteur = "Nuha Ali";
livre1.sujet = "Tutoriel de programmation en C";
livre1.idOuvrage = 6495407;
// Détails du deuxième livre
livre2.titre = "Facturation Télécom";
livre2.auteur = "Zara Ali";
livre2.sujet = "Tutoriel de facturation télécom";
livre2.idOuvrage = 6495700;
// Affichage des informations du premier livre
Console.WriteLine("Titre du livre 1 : {0}", livre1.titre);
Console.WriteLine("Auteur du livre 1 : {0}", livre1.auteur);
Console.WriteLine("Sujet du livre 1 : {0}", livre1.sujet);
Console.WriteLine("ID du livre 1 : {0}", livre1.idOuvrage);
// Affichage des informations du deuxième livre
Console.WriteLine("Titre du livre 2 : {0}", livre2.titre);
Console.WriteLine("Auteur du livre 2 : {0}", livre2.auteur);
Console.WriteLine("Sujet du livre 2 : {0}", livre2.sujet);
Console.WriteLine("ID du livre 2 : {0}", livre2.idOuvrage);
Console.ReadKey();
}
}
Lorsque ce code est compilé et exécuté, il produit les résultats suivants :
Titre du livre 1 : Programmation en C
Auteur du livre 1 : Nuha Ali
Sujet du livre 1 : Tutoriel de programmation en C
ID du livre 1 : 6495407
Titre du livre 2 : Facturation Télécom
Auteur du livre 2 : Zara Ali
Sujet du livre 2 : Tutoriel de facturation télécom
ID du livre 2 : 6495700
Les structures en C# présentent les caractéristiques suivantes :
- Elles peuvant contenir des méthodes, champs, indexeurs, propriétés, opérations personnalisées et événements.
- Elles peuvent définir des constructeurs mais pas de destructeurs. Il n'est pas possible de définir de constructeur sans paramètres. Celui-ci est automatiquement défini et ne peut être modifié.
- Contrairement aux classes, elles ne peuvent pas hériter d'autres structures ou classes.
- Elles ne peuvent pas servir de base pour d'autres structures ou classes.
- Elles peuvent implémenter une ou plusieurs interfaces.
- Les membres des structures ne peuvent pas être déclarés comme abstraits, virtuels ou protégés.
- Lorsqu'on utilise le mot-clé new, un constructeur approprié est appelé pour instancier la structure. Contrairement aux classes, les structures peuvent être instanciées sans utiliser new.
- Si new n'est pas utilisé, tous les champs doivent être initialisés avent que l'objet puisse être utilisé.
Deux : Les Classes
- Définition : Une classe est définie avec le mot-clé class, suivi du nom de la classe. Son corps est contenu dans une paire d'accolades.
Trois : Différences entre les Structures et les Classes
- En termes de syntaxe, les classes sont définies avec le mot-clé class, tandis que les structures utilisent struct.
Définition d'une classe :
class Personne
{
private string nom;
private int age;
public void Saluer()
{
Console.WriteLine("Bonjour, je m'appelle " + this.nom + " et j'ai " + this.age + " ans.");
}
}
Définition d'une structure :
struct Rectangle
{
private int largeur;
private int hauteur;
public int CalculerSurface()
{
return this.largeur * hauteur;
}
}
- Dans une structure, les champs déclarés ne peuvent pas avoir de valeurs par défaut, contrairement aux classes :
public class AA
{
public int a = 1;
public int b;
public int D { get; }
public AA() {}
public AA(int x)
{
// Ne nécessite pas d'initialiser les champs non spécifiés.
}
}
public struct BB
{
public int a; // Champ d'instance : pas de valeur par défaut lors de la déclaration.
public static int b = 10; // Champ statique : peut avoir une valeur par défaut.
public int C => 1; // Propriété avec une valeur de retour par défaut.
public int D { get; }
public static int E { get; }
public BB(int x)
{
a = 1;
D = x;
}
public void Tester()
{
int f = a; // Utilisable même sans valeur par défaut explicite.
f = D;
}
}
- Dans un constructeur de structure, tous les champs doivent être initialisés, ce qui n'est pas obligatoire pour une classe.
- Les structures sont des types par valeur, allouées sur la pile, tandis que les classes sont des types par référence, allouées sur le tas (leur plus grande différence).
- Autres distinctions :
- Les variables de structure libèrent automatiquement leur mémoire après utilisation, tandis que les instances de classe sont gérées par le mécanisme de garbage collector.
Quand utiliser une structure ou une classe ?
- Lorsque l'espace de pile est limité et qu'il y a beaucoup d'objets logiques, les classes sont préférables.
- Pour des objets légers tels que des points, des rectangles ou des couleurs, les structures offrent une meilleure performance.
- Lorsqu'il s'agit de représenter des hiérarchies complexes et abstraites, les classes sont idéales car les structures ne supportent pas l'héritage.
- La plupart du temps, si l'objectif principal est de stocker des données, une structure suffit.