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

Windows Forms Discussion :

[Débutant] Utiliser des listes en argument d'une fonction


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 16
    Points : 9
    Points
    9
    Par défaut [Débutant] Utiliser des listes en argument d'une fonction
    Bonjour,

    J'ai une question à poser:
    Quand on utilise une liste comme argument d'une fonction, la fonction travaille t-elle avec la liste elle-même ou sur une copie de la liste?
    Les changements effectués sur la liste restent t-ils après exécution de la fonction ?

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    http://msdn.microsoft.com/fr-fr/library/4d43ts61.aspx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int AddTen(int number)  // parameter is passed by value
    {
        return number + 10;
    }
     
    void AddTen(ref int number)  // parameter is passed by reference
    {
        number += 10;
    }
    pareil pr les Lists
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    Test Effectué :

    Les List sont passé automatiquement en Référence. CQFD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void test(ref List<int> i)
    //et 
    void test(List<int> i)
    //sont équivalent
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  4. #4
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par zehle Voir le message
    Test Effectué :

    Les List sont passé automatiquement en Référence. CQFD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void test(ref List<int> i)
    //et 
    void test(List<int> i)
    //sont équivalent
    Non, ce n'est pas équivalent. Avec ref, on peut réaffecter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {
      void f(ref List<int> liste) { liste = new List<int>(); }
      void g(List<int> liste) { liste = new List<int>(); }
     
      List<int> l1 = null, l2 = null;
      f(ref l1); => l1 est non null
      g(l2); => l2 est null
    }
    ಠ_ಠ

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    OK merci à vous deux.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Non, ce n'est pas équivalent. Avec ref, on peut réaffecter
    C'est ce que j'ai dit, c'est équivalent, meme sans le Ref, on peut réaffecter (Test à l'appui )

    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
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<int> i = new List<int>();
                i.Add(0);
                Console.WriteLine(i[0].ToString());//Affiche 0
                test(i);
                Console.WriteLine(i[0].ToString());//Affiche 2
                Console.ReadLine();
            }
            static void test(List<int> i)//Pas de REF
            {
                i[0] = 2;
            }
        }
    }
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par zehle Voir le message
    C'est ce que j'ai dit, c'est équivalent, meme sans le Ref, on peut réaffecter (Test à l'appui )
    Non, ce n'est PAS équivalent. repeat after me :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A { }
     
    void f(A a) { a = new A(); }
    void g(ref A a) { a = new A(); }
    A a1 = null;
    A a2 = null;
     
    f(a1); // => a1 reste null, parce que le "a" qui est paramètre de f est une copie de la référence a1
    g(ref a2); // a2 est non null, car a2 et a sont la même chose
    Le paramètre de f est une nouvelle référence vers l'objet référencé par a1; le paramètre de g EST la même référence que a2.

    C'est plus clair ?
    ಠ_ಠ

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    ça doit etre un truc particulier aux List Alors

    en tout cas, teste le code que j'ai donné, tu verra que ça change la valeur de la List (meme sans le "ref"), et puis pour les autres Type (int, double, string ...), pour un passage par référence il faut utiliser le "ref".
    CQFD
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    bah non, il n'y a pas de cas particulier, ref permet le passage de l'argument par reference (qu'il soit intrinsequement un type reference ou valeur). Pour les valeurs, l'utilisation est evidente (c'est conceptuellement proche d'un pointeur, on ne passe plus la variable en tant que copie (aka valeur), mais on passe la variable reelle (en tant qu'adresse)), pour les references, beaucoup moins (faut dire ca ne sert pas des masses).

    Quand tu passes un type reference, il y a bien une copie (au meme titre que tout passage), mais la copie n'est pas l'objet managé, mais son adresse, de fait tu manipules le meme objet mais par une reference differente, il s'en suit que tout changement fait à l'objet sera repercuté en sortie de fonction vu que l'objet lui est le meme. Par contre si tu changes l'objet (par une allocation par exemple), le nouvel objet est contenu dans la copie de la reference et non dans la reference elle meme, de fait, en sortie de fonction, la reference passée en parametre pointe toujours vers le meme objet (celui present avant l'appel).

    Bref, je ne sais pas si c'est bien clair, mais il existe une difference enorme entre func(List<T> truc) et func(ref List<T> truc) dans le premier cas le passage est fait par copie de reference (mais pas de l'objet), dans le second le passage se fait par reference sur reference (outch !).

  10. #10
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par zehle Voir le message
    ça doit etre un truc particulier aux List Alors

    en tout cas, teste le code que j'ai donné, tu verra que ça change la valeur de la List (meme sans le "ref"), et puis pour les autres Type (int, double, string ...), pour un passage par référence il faut utiliser le "ref".
    CQFD
    Excuse moi d'insister, mais tu n'as pas compris

    toute fonction qui prend une classe en paramètre peut modifier les champs de cette classe, et ces modifs seront visibles y compris une fois la fonction finie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A { public int i = 0; }
    void f(A a) { a. i = 2; }
    void g(ref A a) { a. i = 3; }
    A a1 = new A();
    A a2 = new A();
     
    f(a1); // a1 est modifié ; a1.i = 2
    g(ref a2); // a2 est modifié ; a2.i = 3
    Si A n'avait pas été une classe mais une struct, seule g aurait pu modifier les champs, puisqu'avec ref ce n'est pas uen copie de la struct mais la struct elle-même qu'elle peut bidouiller.

    Le mot clé ref, appliqué aux classes, permet à une fonction de non seulement modifier l'objet pointé par une référence, mais surtout la référence elle-même.
    Chose que ne peut pas faire une fonction dont le paramètre n'a pas le mot-clé "ref".

    En C#, il y a deux types d'objet : les type référence (i.e. les classes : Form, XmlDocument, etc.) et les types valeur (i.e. les structs : System.Int32, DateTime, ...). Gaffe.
    ಠ_ಠ

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    Là j'ai compris

    J'ai du faire une confusion, et puis entété comme je l'ai été, j'avais pas bien lu


    Merci, je mourrai moins bête ce soir
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

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

Discussions similaires

  1. Débutant : utiliser des objets d'une dll perso
    Par julien20vt dans le forum ASP.NET
    Réponses: 9
    Dernier message: 28/04/2010, 11h27
  2. Réponses: 3
    Dernier message: 03/03/2010, 19h05
  3. [débutant] filtrer des CheckBox à l'aide d'une liste
    Par mimo13 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/11/2008, 15h16
  4. [+ou- débutant] utilisation des sémaphores
    Par Biosox dans le forum Windows
    Réponses: 4
    Dernier message: 26/05/2008, 12h23
  5. Utilisation des liste à choix multiples
    Par mic79 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/07/2005, 11h40

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