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 :

"Sorte de" pointeur


Sujet :

C#

Vue hybride

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Par défaut "Sorte de" pointeur
    Bonjour tout le monde !

    Voilà je cherche à faire quelque chose d'assez simple :

    J'ai une classe, dont le constructeur prend en paramètre un objet quel qu'il soit.
    Et je voudrais que, plus tard, une méthode de cette classe puisse modifier cet objet.

    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
    class B
    {
    protected object monObjet;
     
    public B(object monObjetParam)
    {
    monObjet = monObjetParam;
    }
     
    public SuperMethode(object machin)
    {
    monObjet = machin;
    }
    }
    Il se trouve que l'objet que je passe au constructeur est un attribut (typiquement et la plupart du temps un string) d'une autre classe (appelons là A).

    Et cela ne fonctionne pas, c'est-à-dire que après modification par appel de la méthode "SuperMethode", l'attribut de la classe A n'est pas modifié.

    Ceci se règlerait simplement avec un pointeur en C++ par exemple. (je dis ça pour fixer les idées, ce n'est pas un troll ).

    Quelqu'un aurait-il une idée ?

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Ca dépend ce que t'appelles modification. Si ton objet est une classe, alors c'est une référence vers lui que tu récupèreras dans ta classe B ; une modif de l'objet hors de la classe sera visible dans ton instance de B, puisque cette instance a une référence vers cet objet.

    Par contre, si cet objet est de type valeur (i.e. une struct), alors chaque passage en paramètre d'une fonction se fait par copie, et tu ne peux pas faire de modif hors de B qui se voie dans B.

    Les strings sont particulières : elles sont immuables. C'est à dire constantes. Donc le seul moyen qu'on a pour modifier un champ de type string, c'est le faire pointer vers une autre string.

  3. #3
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Citation Envoyé par darkfrag Voir le message
    Et cela ne fonctionne pas, c'est-à-dire que après modification par appel de la méthode "SuperMethode", l'attribut de la classe A n'est pas modifié.

    Ceci se règlerait simplement avec un pointeur en C++ par exemple. (je dis ça pour fixer les idées, ce n'est pas un troll ).
    On utilise les mot clés ref ou out dans les paramètres de la méthode ainsi que lors de l'appel de celle ci pour maintenir une référence.

    Par exemple on peut utiliser le mot clé out pour instancier un objet car sans mot clé une instanciation provoque une perte de référence sur l'objet.

    Cependant le comportement dépend aussi du type d'objet passé en paramètre comme le précise Guulh dans le cas d'un type de donnée string qui a la particularité unique d'être un type référence mais se comportant en tant que type valeur. A noter d'ailleurs que c'est le seul type référence du framework qui fonctionne ainsi.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Par défaut
    Ok merci beaucoup.
    J'étudie tout ça demain et je vous tiens au courant.

    Encore merci !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Par défaut
    Ok donc en fait ça veut dire que je n'ai pas de solution si je compte utiliser ça avec des string ?
    On ne peut pas "stocker" une référence ?

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    A moins d'encapsuler ta string dans une classe, non.

    Après, tout dépend de ce que tu veux faire. Comme disait harz62, le mot clé ref pourrait peut-être satisfaire ton besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void f(string s) { s = "toto"; }
    public void g(ref string s) { s = "tata"; }
     
    string a = "hip";
    string b = "hop";
    f(a); // ne changera pas a ; a = "hip".
    g(ref b); // va modifier b ; b va valoir "tata".
    Après, l'absence de "pointeurs" de chaînes m'a jamais manqué en C# (ça dépend des projets, peut être).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Par défaut
    Ok merci beaucoup pour votre aide !

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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