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,
nullest 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)