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 :

Passage de paramètres par référence


Sujet :

Framework .NET

  1. #1
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut Passage de paramètres par référence
    Bonjour !

    Est-ce que vous avez une idée de la différence entre les deux méthodes Play ci dessous. Je ne comprends pas vraiment pourquoi il est permis d'utiliser le mot clef ref dans ce cas sachant que les deux méthodes donne le même résultat. Merci de votre réponse.

    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
            public static void Play(int[] array)
            {
                array[0] = 99;
                array[1] = 99;
            }
     
            public static void Play2(ref int[] array)
            {
                array[0] = 99;
                array[1] = 99;
            }
     
            static void Main(string[] args)
            {
                // Game with array
                int[] sourceOne = new int[] { 1, 2, 4, 5, 66 }; 
                int[] sourceTwo = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
     
                Play(sourceOne);
                Play2(ref sourceTwo);
            }
    Martin

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 66
    Points : 80
    Points
    80
    Par défaut
    Bonne question.


    Je t'invite à lire un de mes messages précédent : http://www.developpez.net/forums/sho...39&postcount=5
    Le code d'exemple est en vb.net mais le principe est le même qu'en C#.
    Xxx(ByVal truc as String) ==> Xxx(string truc)
    Xxx(ByRef truc as String) ==> Xxx(ref string struc)

    En résumé un tableau est un reference type (comme les instances de classes). Quand tu passes un tableau (reference type) à une méthode, il n'est PAS copié! array et sourceOne/Two 'pointent' vers le même tableau. Et ce, que tu utilises ref ou pas.
    Donc dans les deux cas quand tu fait une modification du tableau, cela affecte l'appelant.

    La différence entre utiliser ref ou pas est que l'instruction
    Avec Play() cette ligne n'aura aucun impacte pour l'appelant (sourceOne ne sera pas remplacé par new int[5]), tandis qu'avec Play2(), la variable passée sera modifiée (sourceTwo sera remplacé par new int[5]).

    Attention, le comportement n'est pas le même avec les value type (type de base genre int, boolean,... et les structs).

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par margagn
    Est-ce que vous avez une idée de la différence entre les deux méthodes Play ci dessous. Je ne comprends pas vraiment pourquoi il est permis d'utiliser le mot clef ref dans ce cas sachant que les deux méthodes donne le même résultat.
    Dans ce code-là, ref ne sert à rien.

    Après pourquoi son utilisation n'est pas interdite dans ce cas... ben y a pas trop de raison de l'interdire. Si un développeur veut ajouter plein de mots-clefs inutiles, c'est son problème (et celui de ceux qui mettront les pieds dans le code après et qui perdront du temps à se demander s'il y avait une raison pour avoir mis ça :)

    C'est le genre de choses qui tombent plutôt dans le domaine d'outils d'analyse du code à la FxCop ou de la partie analyse de code de ReSharper. Pas sûr de s'ils couvrent ce cas-là par contre.
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

Discussions similaires

  1. Passage de paramètre par référence
    Par sat83 dans le forum C++Builder
    Réponses: 13
    Dernier message: 15/05/2009, 21h04
  2. Réponses: 8
    Dernier message: 09/08/2007, 17h34
  3. [POO] Passage de paramètre par référence.
    Par abidi_niz dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2006, 12h20
  4. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 12h48
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

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