Constructeurs, Destructeurs et this en C#
Apprenez à utiliser les constructeurs, destructeurs et le mot-clé this en C# pour gérer le cycle de vie des objets.
En C#, les classes et les structures disposent de méthodes spéciales qui définissent comment les objets sont créés et détruits. Un constructeur s’exécute lors de la création d’un objet et assigne les valeurs initiales. Un destructeur est appelé juste avant qu’un objet ne soit supprimé de la mémoire. Le mot-clé this fait référence à l’instance actuelle de la classe et est particulièrement utile en cas de paramètres portant le même nom ou pour l’enchaînement de méthodes.
Constructeur
Un constructeur est une méthode spéciale qui porte le même nom que la classe. Il s’exécute automatiquement lorsqu’un nouvel objet est créé et sert généralement à attribuer des valeurs initiales. Il peut accepter des paramètres et être surchargé. Si aucun constructeur n’est défini, C# fournit automatiquement un constructeur par défaut (sans paramètre).
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
// Constructeur sans paramètre
public Product()
{
Name = "Inconnu";
Price = 0;
}
// Constructeur avec paramètres
public Product(string name, decimal price)
{
Name = name;
Price = price;
}
public void Print()
{
Console.WriteLine($"{Name} - {Price:0.00} EUR");
}
}
class Program
{
static void Main()
{
var p1 = new Product(); // sans paramètre
var p2 = new Product("Cahier", 45m); // avec paramètres
p1.Print(); // Inconnu - 0.00 EUR
p2.Print(); // Cahier - 45.00 EUR
}
}
Destructeur
Un destructeur est défini en préfixant le nom de la classe avec ~ et ne peut pas accepter de paramètres.
Il est appelé juste avant que l’objet ne soit libéré de la mémoire par le ramasse-miettes (Garbage Collector).
Bien qu’il puisse être utilisé pour des opérations de nettoyage comme la fermeture de fichiers ou la libération de mémoire,
le système de gestion de la mémoire de .NET rend généralement inutile la définition manuelle d’un destructeur.
public class Logger
{
public Logger()
{
Console.WriteLine("Logger démarré.");
}
~Logger()
{
Console.WriteLine("Logger nettoyé de la mémoire.");
}
}
class Program
{
static void Main()
{
var log = new Logger();
log = null;
// Déclencher le Garbage Collector
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
Le mot-clé this
this fait référence à l’instance actuelle d’une classe.
Il est utilisé pour distinguer les paramètres et les propriétés portant le même nom,
pour l’enchaînement de méthodes (method chaining) ou pour appeler un autre constructeur dans la même classe.
public class Customer
{
public string Name { get; set; }
public string Email { get; set; }
// Constructeur avec paramètres du même nom que les propriétés
public Customer(string name, string email)
{
this.Name = name; // affectation avec this
this.Email = email;
}
// Enchaînement de méthodes (method chaining)
public Customer SetName(string name)
{
this.Name = name;
return this;
}
public Customer SetEmail(string email)
{
this.Email = email;
return this;
}
public void Print()
{
Console.WriteLine($"{Name} - {Email}");
}
}
class Program
{
static void Main()
{
var c = new Customer("John", "john@example.com")
.SetName("Michael")
.SetEmail("michael@example.com");
c.Print(); // Michael - michael@example.com
}
}
Appeler un Constructeur avec this
Avec this(...), un constructeur peut en appeler un autre dans la même classe.
Cette approche réduit la duplication de code et centralise l’initialisation commune.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name) : this(name, 0) // appelle l’autre constructeur
{
}
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void Print()
{
Console.WriteLine($"{Name} ({Age})");
}
}
class Program
{
static void Main()
{
var p1 = new Person("Alice");
var p2 = new Person("Marie", 25);
p1.Print(); // Alice (0)
p2.Print(); // Marie (25)
}
}
TL;DR
- Constructeur : S’exécute lors de la création d’un objet, assigne les valeurs initiales.
- Destructeur : S’exécute avant la suppression d’un objet de la mémoire ; rarement nécessaire car le GC gère le nettoyage.
- this : Représente l’objet actuel ; utilisé pour distinguer paramètres et propriétés, l’enchaînement de méthodes et l’appel de constructeurs.