150 votes

Ordre d'exécution des constructeurs C#

En C#, lorsque vous faites

Class(Type param1, Type param2) : base(param1) 

Le constructeur de la classe est-il exécuté en premier, puis le constructeur de la superclasse est appelé ou le constructeur de la base est-il appelé en premier ?

1 votes

Je n'ai jamais utilisé XNA, mais je ne vois pas de question dans votre... question.

4 votes

C'est tout ? C'est tout ce que vous nous donnez comme base de travail ? Allez, donnez-nous un indice... animal, végétal, minéral ?

2 votes

J'ai appuyé sur le bouton trop vite xD... Désolé, j'étais encore en train d'écrire...

194voto

Jon Skeet Points 692016

L'ordre est le suivant :

  • Les variables membres sont initialisées à des valeurs par défaut pour toutes les classes de la hiérarchie.

Puis en commençant par la classe la plus dérivée :

  • Les initialisateurs de variables sont exécutés pour le type le plus dérivé.
  • Le chaînage des constructeurs permet de déterminer quel constructeur de la classe de base va être appelé.
  • La classe de base est initialisée (recurse tout ça :)
  • Les corps des constructeurs de la chaîne de cette classe sont exécutés (notez qu'il peut y en avoir plusieurs s'ils sont enchaînés avec des Foo() : this(...) etc.

Notez qu'en Java, la classe de base est initialisée antes de les initialisateurs de variables sont exécutés. Si vous portez un jour du code, c'est une différence importante à connaître :)

J'ai un page avec plus de détails si vous êtes intéressé.

6 votes

Il semble que la moitié de mes contributions ici renvoient à ses réponses, mais Eric Lippert a également écrit deux bons billets sur ce sujet : blogs.msdn.com/ericlippert/archive/2008/02/15/ blogs.msdn.com/ericlippert/archive/2008/02/18/

0 votes

Y compris les effets des initialisateurs de collection, un peu plus en profondeur que la question peut-être, mais une bonne lecture.

1 votes

+1 pour la comparaison avec Java. Je pense aussi que c'est le cas pour C++ mais je n'en suis pas sûr à 100%.

61voto

Yuriy Faktorovich Points 33347

Il appellera d'abord le constructeur de base. Gardez également à l'esprit que si vous ne mettez pas la balise :base(param1) après votre constructeur, le constructeur vide de la base sera appelé.

17voto

tanascius Points 22712

Le constructeur de la classe de base est appelé en premier.

1voto

Rob Levine Points 20793

[Edit : dans le temps qu'il m'a fallu pour répondre, la question avait totalement changé].

La réponse est qu'il appelle la base en premier.

[Réponse originale à l'ancienne question ci-dessous]

Demandez-vous quand vous feriez la partie "base" de l'appel au constructeur ?

Si c'est le cas, vous "chaînerez" un appel au constructeur de base si la classe est dérivée d'une autre classe qui possède ce constructeur :

  public class CollisionBase
    {
        public CollisionBase(Body body, GameObject entity)
        {

        }
    }

    public class TerrainCollision : CollisionBase
    {
        public TerrainCollision(Body body, GameObject entity)
            : base(body, entity)
        {

        }
    }

Dans cet exemple, TerrainCollision provient de CollisionBase . En enchaînant les constructeurs de cette manière, on s'assure que le constructeur spécifié est appelé sur la classe de base avec les paramètres fournis, plutôt que le constructeur par défaut (s'il en existe un sur la base).

0voto

JaredPar Points 333733

Votre question est un peu floue, mais je suppose que vous vouliez demander ce qui suit

Quand dois-je appeler le constructeur de base de mon objet XNA plutôt que d'utiliser le constructeur par défaut impitoyable ?

La réponse à cette question dépend fortement de votre scénario et de l'objet sous-jacent. Pourriez-vous clarifier un peu les points suivants

  • Quel est le scénario
  • Quel est le type de l'objet de base de TerrainCollision ?

Ma meilleure réponse est que dans le cas où vous avez des paramètres qui correspondent aux paramètres du constructeur de la classe de base, vous devriez presque certainement l'appeler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X