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 :

this passé par valeur ?


Sujet :

C#

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut this passé par valeur ?
    Bonjour,

    j'assiste à un phénomène curieux.
    À partir d'un objet A, j'en crée un autre B auquel je passe une (référence/valeur?) "this" à la construction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new SubsetComputerClient_FederalBasket(this);
    Mais si je modifie des valeurs (des listes) de A, B ne voit pas ces changement, B semble donc possédé l'ancienne version (une copie faite à la création de B) de l'objet A.

    En fait B doit juste accéder à une liste L de A, au début j'avais employé des échanges de delegates mais j'avais le même problème (closure).


    Je suis très surpris par ce comportement, que faire ?

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Types valeur, passage par valeur.
    Types référence, passage par référence.

    Type valeur = structures et énumérations
    Type référence = le reste

    A priori, soit tu utilises des structures soit tes listes sont renvoyées sous forme d'une copie afin d'éviter toutes modifications des collections originales. Sans code, difficile d'aller plus loin.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Le voici (pas dans son intégralité, vu la complexité du tout).

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    class SubsetComputer_FederalBasket : SubsetComputer
    {
        public MembersManagement mgt;
    
        public SubsetComputer_FederalBasket(SubsetCollaborator environment)
            : base(environment)
        {
            ...
        }
    
        protected override void pSubComputeRow()
        {
            ...
            // Problème, this.mgt n'est pas d'actualité
            this.mgt.HaveMembersCard.TryGetValue(Convert.ToInt64(dr["members_id"]), out hasCard);
            ...
        }
    }
    
    class SubsetComputerClient_FederalBasket : SubsetComputerClient
    {
        public MembersManagement mgt;
    
        public SubsetComputerClient_FederalBasket(MembersManagement mgt)
            : base()
        {
            ...
    
            this.mgt = mgt;
        }
    
    
        // C'est ici que la valeur est passé du SubsetComputerClient au SubsetComputer
        public override void SetRequestElement(SubsetComputer computer)
        {
            // Problème, this.mgt n'est pas d'actualité
            ((SubsetComputer_FederalBasket)computer).mgt = this.mgt;
        }
    }
    
    public partial class MembersManagement : MyGolfBindingPage
    {
        #region Fields
        ...
        private Dictionary<long, bool> haveMembersCard;
        ...
         #endregion
    
        #region Load
        private void Page_Load(object sender, System.EventArgs e)
        {
        ...
    
        #region loadData
        public Dictionary<long, bool> HaveMembersCard
        {
            get
            {
                if (this.haveMembersCard == null)
                {
                    this.haveMembersCard = new Dictionary<long, bool>();
                    foreach (FederalCardEntry card in this.alCards)
                    {
                        this.haveMembersCard.Add((long)card.Id, true);
                    }
                }
    
                return this.haveMembersCard;
            }
            set
            {
                this.haveMembersCard = value;
            }
        }
    
        // appel ici
        public SubsetComputerClient getFederalBasketComputerClients()
        {
            return new SubsetComputerClient_FederalBasket(this);
        }
    ...
    J'espère que ça suffira.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Je suis toujours bloqué par ceci et j'ai vraiment besoin d'aide.
    Est-ce qu'il vous faut plus d'éléments ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2004
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    salut,

    dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public SubsetComputerClient_FederalBasket(MembersManagement mgt)
            : base()
        {
            ...
     
            this.mgt = mgt;
        }
    renomme ton paramètre en autre chose que mgt.

    je ne suis pas sur que le compilateur fasse clairement la différence entre ton attribut et ton parametre.

    au besoin met un point d'arret sur :

    this.mgt = mgt;

    afin de voir si mgt contient ce que tu attends

    il met d'avis que :

    this.mgt = null

    puis que quand tu la consomme ,elle est initialisée lors que tu l'appelles via le get :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     get
            {
                if (this.haveMembersCard == null)

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Non, cette asignation fonctionne correctement, this.mgt prend bien la valeur.
    Sinon, d'ailleurs j'aurais un "null exception" lorsque j'appellerai des éléments de l'ojbet.

  7. #7
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Tout à fait d'accord avec la remarque sur le nommage de 'mgt'. J'ajouterai que tu devrais utiliser une propriété et pas un champ public.
    Peux-tu essayer de faire ces changements et voir ce qui se passe ?

  8. #8
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    j ai voulue reproduire ce probleme avec un projet simple et je ne constate pas le meme problème, l'objet passé au constructeur est bien une reference.

    ...

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par ZaaN Voir le message
    j ai voulue reproduire ce probleme avec un projet simple et je ne constate pas le meme problème, l'objet passé au constructeur est bien une reference.

    ...
    Ok, je vois plus clair maintenant.

    L'objet dont la référence devient osbolète est une page web (asp.net).
    Une page web est (je supose) recréer à chaque rafraîchissement/postback et donc la référence en mémoire est celle d'une instance précédente de la page...

    Bon, maintenant que c'est expliqué il va falloir que je trouve quoi faire.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/04/2015, 10h30
  2. récupérer valeurs d'un tableau passé par post
    Par rvm31 dans le forum Langage
    Réponses: 5
    Dernier message: 27/01/2012, 21h03
  3. jQuery avec ajax ne passe par la valeurs en data
    Par firens dans le forum jQuery
    Réponses: 1
    Dernier message: 01/11/2011, 16h00
  4. [XML] sitemap.xml et passe des valeurs par l%u2019url
    Par voyageurdumonde dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 16/09/2011, 00h54
  5. Réponses: 4
    Dernier message: 19/03/2007, 17h12

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