Sobes.tech
Junior

Quelle est la différence entre classes et structures en C#?

sobes.tech IA

Réponse de l'IA

Les classes sont des types de référence, les structures sont des types de valeur.

  • Emplacement en mémoire : Les instances de classes sont placées dans le tas géré (Heap), les structures dans la pile (Stack) ou à l'intérieur de l'objet auquel elles appartiennent.
  • Héritage : Les classes supportent l'héritage, pas les structures. Les structures peuvent implémenter des interfaces.
  • Valeur par défaut : Pour les classes, null est la valeur par défaut. Pour les structures, un ensemble de zéros pour les champs.
  • Passage aux méthodes : Les instances de classes sont passées par référence (une référence à l'objet est transmise). Les structures sont passées par valeur (une copie est créée).
  • Performance : Les structures peuvent être plus rapides que les classes pour de petits objets, car elles évitent les coûts de gestion du tas et de collecte de déchets. Cependant, passer de grandes structures par valeur peut être moins efficace.
  • Création : Pour les structures, un constructeur implicite sans paramètres initialise les champs à zéro. Pour les classes, un constructeur explicite sans paramètres est requis si d'autres constructeurs sont définis.
Caractéristique Classe (Class) Structure (Struct)
Type Référence Valeur
Emplacement en mémoire Tas géré Pile / Interne
Héritage Supporte Ne supporte pas (mais implémente des interfaces)
Valeur par défaut null Ensemble de zéros
Passage Par référence Par valeur
Performance Peut être plus lent pour de petits objets Peut être plus rapide pour de petits objets
Constructeur implicite Non (si d'autres existent) Oui (initialisation à zéro)
// Exemple de classe
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointClass(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Exemple de structure
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointStruct(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Démonstration de passage
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Modifiera le PointClass d'origine
    ps.X = 100; // Modifiera seulement la copie de PointStruct
}

// Utilisation
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X sera 100
// pointStruct1.X sera 1 (car seule la copie a été modifiée)