Ordre d’appel des constructeurs cas d’inheritance en c #

Je lisais simplement Inheritance in C # dans lequel je suis tombé sur les constructeurs et j’ai écrit que les constructeurs sont exécutés dans l’ordre de leur dérivation. Cela signifie que ce constructeur de classe de base sera appelé première classe ou classe dérivée.

Les constructeurs de classe sont appelés dans l’ordre impliqué par la dérivation, mais il est important de noter qu’en C #, les initialiseurs de champ (par exemple, int foo=5 ) sont exécutés avant le constructeur de la classe de base, et donc dans l’ordre inverse. Cela est principalement utile si le constructeur de base peut provoquer l’appel d’une fonction virtuelle qui est remplacée dans la classe dérivée avant la fin du constructeur de base. Une telle fonction verra toutes les variables initialisées par les initialiseurs de champs comme ayant été initialisées.

VB.net, incidemment, exécute tous les initialiseurs de champ une fois le constructeur de la classe de base terminé, mais avant tout élément du constructeur de la classe dérivée (autre que la chaîne du constructeur de base). Cela signifie que les méthodes virtuelles doivent savoir que les initialiseurs de champ n’ont peut-être pas été exécutées, mais également que les initialiseurs de champ peuvent utiliser l’object sous des constructions (ce qu’elles ne peuvent pas faire en C #).

Incidemment, dans VB.net, il est possible, bien que maladroit, d’initialiser en toute sécurité des champs avec des instances IDisposable nouvellement créées (et de s’assurer qu’elles seront éliminées si une partie du processus de construction lève une exception). En C #, il faut s’abstenir d’utiliser des initialiseurs de champ pour créer tout ce qui ne peut pas être abandonné en toute sécurité si la construction lève une exception, car il n’y aura aucun moyen d’accéder à l’object partiellement construit pour le nettoyer.

Le constructeur de la classe de base sera appelé en premier. Vous pouvez tester cela assez facilement vous-même:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DerivationTest { class Program { public class Thing { public Thing() { Console.WriteLine("Thing"); } } public class ThingChild : Thing { public ThingChild() { Console.WriteLine("ThingChild"); } } static void Main(ssortingng[] args) { var tc = new ThingChild(); Console.ReadLine(); } } } 
 using System; class Parent { public Parent () { Console.WriteLine("Hey Its Parent."); } } class Derived : Parent { public Derived () { Console.WriteLine("Hey Its Derived."); } } class OrderOfExecution { static void Main() { Derived obj = new Derived(); } } 

La sortie de ce programme est montrée ici:

Hey son parent.

Hey c’est dérivé.

Le constructeur agit différemment dans le bit d’inheritance, ce qui est source de confusion pour les nouveaux programmeurs. Il existe deux concepts dans l’exécution du constructeur 1. Appel 2. Exécution Lorsque vous créez un object de votre classe dérivée Named Derived, le constructeur passe d’abord à Derived () puis à Parent () en raison de son appel. L’appel du constructeur se fait de bas en haut, mais vous le trouvez ensuite. Exécute Parent () d’abord, puis Derived, en raison de son exécution. Constructeurs exécutés de haut en bas. C’est pourquoi il affiche d’abord Parent, puis Base, tandis que le constructeur de base est appelé en premier.