IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

test d'un bout de code


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut test d'un bout de code
    tester ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    namespace TestConsole
    {
    public abstract class Foo
    {
    static Foo()
    {
    Console.Write("Constructeur Foo");
    }
    public static string Instance;
    public static void SetInstance(string ins)
    {
    Instance = ins;
    }
    }
    public class Bar : Foo
    {
    static Bar()
    {
    Console.Write("constructeur Bar");
    SetInstance("hello word");
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    Console.Write(Bar.Instance + "opps");
    }
    }
    }
    Pourquoi ca donne ce résultat?

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Cela vient juste du fait que les constructeurs static ne peuvent pas être chainés. Du coup comme celui de Foo est appelé en premier celui de Bar ne l'est jamais.

  3. #3
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Hum, ta réponse me semble un peu douteuse...

    En fait le problème vient du fait que tu appelles la méthode Instance de la classe Foo (même si dans le code tu indiques Bar, c'est au final la méthode de Foo qui est appelée par le jeu de l'héritage), ce qui impose à la CLR de charger la type Foo (et par là même d'appeler le constructeur statique). En revanche, à aucun moment la CLR n'a besoin d'instancier le type Bar. Son constructeur statique n'est donc jamais appelé.

    Ci-dessous un code qui met cela en évidence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
        public abstract class Foo
        {
            static Foo()
            {
                Console.WriteLine("Constructeur Foo");
            }
            public static string Instance;
            public static void SetInstance(string ins)
            {
                Instance = ins;
            }
        }
        public class Bar : Foo
        {
            static Bar()
            {
                Console.WriteLine("constructeur Bar");
                SetInstance("hello word");
            }
     
            public static void Test()
            {
                Console.WriteLine("Test");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Bar.Instance);
                Bar.Test();
                Console.WriteLine(Bar.Instance);
                Console.ReadLine();
            }
        }

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Hum exact !

    Ceci dit, il est vrai que les constructeurs static ne peuvent être chainés à la différence des constructeurs non statics.

    Mais oui j'ai un peu répondu à côté de la plaque

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    merci pour l'info. Il faut que je lise plus à fond comment fonctionne la CLR ;-)

Discussions similaires

  1. Je teste des bouts de code
    Par mimagyc dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/12/2007, 12h18
  2. [XML][XSL] déplacer bout de code XML
    Par majanissa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 14/09/2005, 17h17
  3. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  4. bout de code à dechifrer svp
    Par bball dans le forum C
    Réponses: 32
    Dernier message: 20/01/2005, 23h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo