Comment appeler un constructeur depuis un autre en C# : solutions simples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi c'est important : un constructeur c'est bien, deux c'est mieux

\n\n

Avez-vous déjà écrit une classe en C# et remarqué que vous avez plusieurs constructeurs qui font presque la même chose ? Par exemple, l'un prend un nom et un âge, un autre seulement le nom, un troisième rien du tout. Au lieu de copier le même code dans chaque constructeur, C# propose une solution élégante : appeler un constructeur depuis un autre. Cela ne fait pas seulement gagner du temps — cela rend le code plus propre, plus compréhensible et plus facile à maintenir. Aujourd'hui, nous allons explorer ce sujet avec des exemples concrets, comme si vous veniez de tomber sur une question populaire sur Stack Overflow. C'est parti !

\n\n

Comment fonctionne l'appel d'un constructeur depuis un autre en C#

\n\n

En C#, vous pouvez appeler un constructeur depuis un autre en utilisant les mots-clés this et base. Cela s'appelle la "chaîne de constructeurs" (constructor chaining). Analysons les deux options.

\n\n

1. Le mot-clé this — appel d'un constructeur dans la même classe

\n\n

Lorsque vous avez plusieurs constructeurs dans une même classe, vous pouvez utiliser this pour déléguer le travail à l'un d'eux. C'est particulièrement utile lorsqu'un constructeur est une "généralisation" d'un autre.

\n\n

Exemple simple : une classe Person qui stocke un nom et un âge. Le constructeur par défaut définit des valeurs standard, tandis que le constructeur paramétré permet de les personnaliser.

\n\n
public class Person\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n\n    // Constructeur par défaut\n    public Person() : this("Invité", 18)\n    {\n        // Rien à écrire ici — la chaîne fait tout\n    }\n\n    // Constructeur avec paramètres\n    public Person(string name, int age)\n    {\n        Name = name;\n        Age = age;\n    }\n}
\n\n

Dans ce code, le point clé est : this("Invité", 18). Lorsque vous créez un objet avec new Person(), le constructeur sans paramètres est appelé, mais il délègue immédiatement au constructeur à deux paramètres, en lui passant les valeurs "Invité" et 18. Ainsi, toute la logique d'initialisation se trouve à un seul endroit.

\n\n

2. Le mot-clé base — appel du constructeur de la classe de base

\n\n

Si votre classe hérite d'une autre classe, vous pouvez appeler le constructeur de la classe de base via base. Cela garantit que la partie héritée de l'objet est correctement initialisée.

\n\n

Exemple : une classe de base Animal et une classe dérivée Dog.

\n\n
public class Animal\n{\n    public string Species { get; set; }\n\n    public Animal(string species)\n    {\n        Species = species;\n    }\n}\n\npublic class Dog : Animal\n{\n    public string Breed { get; set; }\n\n    // Le constructeur Dog appelle le constructeur Animal\n    public Dog(string breed) : base("Chien")\n    {\n        Breed = breed;\n    }\n}
\n\n

Ici, : base("Chien") indique au compilateur : "Exécute d'abord le constructeur de la classe de base Animal avec l'argument 'Chien', puis continue l'initialisation de Dog". Sans cela, vous obtiendriez une erreur de compilation, car Animal n'a pas de constructeur par défaut.

\n\n

Exemple concret : une question populaire sur Stack Overflow

\n\n

Imaginez que vous travaillez sur une application de boutique en ligne. Vous avez une classe Order qui peut être créée de différentes manières : avec un identifiant client, avec un ensemble complet de données, ou sans paramètres (pour les tests).

\n\n
public class Order\n{\n    public int OrderId { get; set; }\n    public int CustomerId { get; set; }\n    public decimal TotalAmount { get; set; }\n    public DateTime CreatedDate { get; set; }\n\n    // Constructeur sans paramètres — pour les tests\n    public Order() : this(0, 0, 0)\n    {\n    }\n\n    // Constructeur avec données minimales\n    public Order(int customerId, decimal totalAmount) : this(0, customerId, totalAmount)\n                

Blogs

Book Recommendations