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 :

variable StringBuilder avec mot clé ref


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut variable StringBuilder avec mot clé ref
    Bonjour,

    J'ai besoin de mieux comprendre ce qui se passe avec une variable de type StringBuilder qui a le mot clé ref devant son nom.

    En effet, une variable de type StringBuilder est de type reference par défaut, quel est le besoin de rajouter le mot clé ref devant une variable de ce type?
    Voici le code en question
    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
    
    using System; 
    using System.Text;
    
    public static void Main(){
    
    
    StringBuilder  sb0= new StringBuilder("essai0");
    
    StringBuilder  sb1= new StringBuilder("essai1");
    
    StringBuilder  sb2= new StringBuilder("essai2");
    StringBuilder sb3;
    
    
    Console.WriteLine("Dans fonction appelante avant appel: sb0={0}, sb1={1}, sb2={2}, sb0, sb1, sb2);
    
    
    ChangeStringBuilder(sb0, sb1, ref sb2, out sb3); 
    
    Console.WriteLine("Dans fonction appelante après appel: sb0={0}, sb1={1}, sb2={2}, sb3={3}", sb0, sb1, sb2, sb3);}
    
    private static void ChangeStringBuilder(StringBuilder sbfo, StringBuilder sbf1, ref StringBuilder sbf2, out StringBuilder sbf3){
    
    Console.WriteLine("Début fonction appelée:sbf0={0}, sbf1={1}, sbf2={2}", sbf0, sbf1, sbf2);
    sbfo.Append("*****");
    sbf1= new StringBuilder("essai1*****");
    sbf2= new StringBuilder("essai2*****");
    sbf3= new StringBuilder("essai3*****");
    
    Console.WriteLine("Fin de fonction appelée : sbf0={0}, sbf1={1},  sbf2={2}, sbf3={3}", sbf0, sbf1, sbf2, sbf3);
    
    
    }//fin de fonction
    
    }//fin de Main
    
    }//fin de classe
    Le résultat de l'appel de la fonction ChangeStringBuilder(sb0, sb1, ref sb2, out sb3); est le suivant

    Dans fonction appelante avant appel : sb0=essai0, sb1=essai1, sb2= essai2

    Début fonction appelée : sbf0=essai0, sbf1= essai1, sbf2= essai2

    Fin de fonction appelée : sbf0=essai0*****, sbf1=essai1*****, sbf2=essai2*****, sbf3= essai3*****

    Dans fonction appelante après appel : sb0=essai0*****, sb1=essai1, sb2=essai2*****, sb3=essai3*****

    Je ne comprends pas bien pourquoi sb1 n'est pas modifié alors que sb2 est modifié.

    Merci beaucoup de votre aide.

    Bien cordialement


    new_wave

  2. #2
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 661
    Par défaut
    Bonjour,

    La clé la dedans c'est le new.

    C'est un peu technique mais en gros dès lors que tu crée un nouvel objet dans un scope réduit, comme dans ta fonction, tu ne travailles plus avec l'objet originel. le mot-clé ref permet de s'assurer de ça, même si celui-ci est plutôt utilisé pour des structs. D'ailleurs c'est l'un des rares cas ou ref est utile avec un objet de classe.

    Quelques liens qui expliquent ça bien mieux que moi :

    https://stackoverflow.com/a/971275

    https://stackoverflow.com/a/8708674

    En tout cas sujet intéressant s'il en est.

  3. #3
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Si tu comprends pourquoi la variable sb3 (qui est en out) est modifiée, alors sache qu'un ref dans ce contexte, c'est l'équivalent d'un in out (variable utilisée en entrée et en sortie).

    Sans rien (cas de sb1), la variable est utilisée uniquement en entrée. Cela signifie :
    - toute modification de la variable au sein de la méthode n'a pas d'impact en dehors de la méthode
    - toute modification de l'objet référencé par la variable est répercuté.

    Dans ta méthode, tu initialises un nouvel objet StringBuilder, tu es donc dans le premier cas : tu modifies la variable en la faisant pointer sur un autre objet, puis tu modifies cet objet.

    Résultat des courses : l'objet initial sur lequel pointe sb1 lors de l'appel de ta méthode n'est pas modifié.

  4. #4
    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
    Pfiou, ben vous vous en posez des questions à mon sujet

    Désolé, je suis déjà dehors

  5. #5
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Pfiou, ben vous vous en posez des questions à mon sujet
    Le pire : je ne peux pas écrire StringBuilder dans un code C# sans penser une seconde à toi depuis que je suis sur DVP Niveau personnal branding, tu fais très fort

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/12/2014, 08h45
  2. [2008R2] variable texte unique en entrée pour recherche avec mots clés
    Par rikidi dans le forum Développement
    Réponses: 6
    Dernier message: 19/02/2013, 14h40
  3. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45
  4. [VB.NET] Fichier Excel vérouillé avec mot de passe
    Par rafano dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/06/2004, 14h36
  5. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20

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