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

C# Discussion :

Valeur "globale" ?


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Valeur "globale" ?
    Bonjour,

    Je cherche un moyen de référencer un objet "parent" sans pour autant devoir avoir une référence explicite à ce dernier.

    Voici un exemple :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace VariableGlobale
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<B> list = new List<B>(4);
     
                for (int i = 0; i < 3; i++)
                {
                    list.Add(new B(i));
                }
     
                foreach (B b in list)
                {
                    foreach (A a in b.list)
                    {
                        Console.WriteLine(a.ToString());
                    }
                    Console.WriteLine();
                }
     
                Console.ReadKey(true);
            }
        }
     
        class A
        {
            public int Id;
     
            public A(int id)
            {
                Id = id;
            }
     
            public override string ToString()
            {
                // Ici, je veux pouvoir retrouver aussi le Id du B qui contient le A.
                // return string.Format("{0} - {1}", parent.Id.ToString(), Id.ToString());
                return Id.ToString();
            }
        }
     
        class B
        {
            public List<A> list;
            public int Id;
     
            public B(int id)
            {
                Id = id;
                list = new List<A>(id);
     
                for (int i = 0; i <= Id; i++)
                {
                    list.Add(new A(i));
                }
            }
        }
    }
    Dans la ToString() de A, je souhaite pouvoir indiquer aussi dans quel B il est instancié.

    Des propriété statiques ne me permettent pas de répondre au problème.

    Je ne souhaite pas, depuis B, passer une référence à lui-même dans les A qu'il instancie.

    Le fond de la question, c'est "comment gérer plusieurs contextes selon le périmètre" ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Je ne souhaite pas, depuis B, passer une référence à lui-même dans les A qu'il instancie.
    Pourquoi ? En quoi est-ce un problème ?
    C'est pourtant la bonne (et a priori la seule) façon de faire...

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Parce que, pour reprendre l'exemple de ma librairie de gestion de fichiers à pas fixe :
    - Je déclare les informations de culture au niveau de l'objet "FlatFile".
    - J'ai besoin de cette information au niveau de l'objet "Field", qui est imbriqué sous forme d'une liste dans un objet Record, qui lui-même est imbriqué dans FlatFile sous forme d'une liste.

    Cette information de culture est une information de contexte.
    Ça me gêne de devoir la propager manuellement à travers des objets qui n'ont pas du tout besoin de cette information.

    Une solution serait éventuellement de déplacer la méthode ToFileString() de Field dans FlatFile, en lui passant en paramètre le Field... Mais je trouve ça guère moins crade...

    Du coup, la bonne aubaine, vu que j'en ai besoin que dans les opération de lecture de fichier et écriture de fichier, je colle les informations de culture dans le CurrentContext du Thread en cours. Mais là c'est parce que j'ai beaucoup de chance...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Du coup, la bonne aubaine, vu que j'en ai besoin que dans les opération de lecture de fichier et écriture de fichier, je colle les informations de culture dans le CurrentContext du Thread en cours. Mais là c'est parce que j'ai beaucoup de chance...
    Pas très propre... si tu veux rendre l'information contextuelle, tu peux effectivement faire un singleton, mais en le rendant ThreadStatic, de façon à ce que chaque thread ait sa propre copie. C'est un peu le même principe que pour CultureInfo : CurrentCulture renvoie la culture courante du thread en cours, et non pas de toute l'appli.


    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
    class FlatFileInfo
    {
        private FlatFileInfo() { }
     
        [ThreadStatic]
        private static FlatFileInfo _instance;
     
        public static FlatFileInfo Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new FlatFileInfo();
                return _instance;
            }
        }
    }
    (pas besoin de se prendre la tête avec des locks, puisque chaque thread a sa propre copie de _instance)

    Mais bon, je persiste à préférer le passage de l'objet FlatFileInfo en paramètre...

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