Considérez le code suivant:
la méthode d'appel forte> p> < Pré> xxx pré> constructeur deux. p>
Total = 3 P>
constructeur un. Base. P>
BlockQuote> Pourquoi le 2e constructeur est-il exécuté en premier? p> Je comprends que dans des constructeurs enchaînés, nous appelons le constructeur de la classe de base, puis sauvegardez la chaîne, mais lorsque le constructeur est maintenu dans la même classe, pourquoi voyons-nous quand même le constructeur supplémentaire s'appelle d'abord? P> J'aurais pensé que le contenu du constructeur le plus de base serait exécuté en premier. p> p>
4 Réponses :
Vous avez donné l'explication vous-même. Il est presque la même chose que les constructeurs de base sont appelés. Chaque fois que vous appelez un constructeur dans votre signature, comme ou p> le constructeur juste après le : code> est appelé premier. p> p>
Y a-t-il une raison pour laquelle cela a été codé de cette façon dans le cadre?
Le constructeur «RAW», paramétré sans paramétrage (par exemple) initialiser certaines propriétés ou champs (dont les valeurs pourraient être définies dans un constructeur paramétré puis sans lancer une exception de référence null).
@Csharpened je n'ai aucune explication pourquoi il est codé de cette façon. La mise en œuvre intérieure appelle probablement le constructeur après le ":" immédiatement, comme dans Java. Il est également courant d'appeler "Super ()" ou "Ceci ()" comme premier mot clé après la signature.
@CSharpened Je suppose que vous voudriez avoir la possibilité d'appeler un constructeur plus spécifique à partir de votre constructeur par défaut pour pouvoir passer des valeurs par défaut. Appelez-le en utilisant : code> fait également toute l'autre instanciation afin que vous sachiez que la classe est d'abord construite avant d'utiliser les paramètres plus généraux. Si vous vouliez que vous puissiez, vous pouvez également vous appeler plus de constructeur spécifique dans votre constructeur par défaut bien sûr.
Je pense que le compilateur exécute le scénario plus sûr.
Si vous appelez un autre constructeur ici, il y a des chances que cet autre constructeur soit un prérequis em> à votre constructeur actuel. Ce comportement est cohérent avec celui exposé lors de l'appel des constructeurs de base, à prévoir. P>
Lors de la création d'une nouvelle instance d'une classe, il existe une chaîne de constructeurs qui sont appelés à partir du moins spécialisé (le constructeur de la classe d'objets) au plus spécialisé (le constructeur de votre classe actuelle). p>
L'opérateur : code> vous permet de
Aussi: même si vous ne l'écrivez pas comme telle telle explicitement, le constructeur code> est appelé toujours avant le constructeur de la classe, afin d'ajouter : ceci (..) code > sera donc aussi appelé d'abord. C'est en ligne avec le Bahavior qui était déjà là implicitement.
Oui c'est une chaîne de dépendance. L'opérateur : code> est utilisé pour ajouter explicitement des éléments à cette chaîne de dépendance.
Il appelle le constructeur 1 d'abord, mais Ctor1 em> appelle Ctor2 em> Avant de frapper le bloc de code CTOR1, d'où la sortie que vous voyez. Un moyen de voir , mais pour conserver le comportement sec serait de refactoriser le hors d'intérêt, chaînants constructeurs de cette façon est Souvent appelé ' DÉLÉGUANT Constructeurs '. p> en Java, il est possible de placer l'appel à l'autre constructeur du bloc de code (par exemple, voir ici ), mais il doit s'agir de la première ligne du bloc p> p> (int, int) code> surcharge: p>
C'est logique lorsque vous considérez qu'il y a toujours une chaîne hiérarchique d'appels de constructeur lors de l'initialisation de nouveaux objets. Comme vous le direz à juste titre, le constructeur de classes de base s'appelle d'abord.
Les deux formes d'initialisateur de constructeur, Donc, dans votre cas, nous avons une chaîne: p> alors ... p> Alors ... p> : base (...) code>, qui est souvent impliqué implémenté et (...) code> se comporter de la même manière. P>
Au fait, ce n'est pas récursif.
Je pense que c'est toujours un constructeur enchaînant.
Merci. C'était mon erreur de penser que c'était un constructeur récursif. J'ai approuvé le titre au titre. Donc, ce que nous examinons ici, c'est essentiellement un constructeur enchaînant mais dans la même classe plutôt que sur des classes héritées et de base?
Ce n'est pas complètement clair pour moi ce que vous demandez - "Pourquoi le 2e constructeur est-il exécuté en premier?" - Parce que vous avez Demandé i> que la seconde soit courante en premier! Si vous voulez un comportement différent, vous devrez écrire un code différent.