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 :

opérateurs implicites et références d'objets


Sujet :

C#

  1. #1
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut opérateurs implicites et références d'objets
    Bonjour,

    J'ai d'une classe qui "wrappe" System.String et qui utilise les opérateurs impilictes pour l'affectation et la lecture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static implicit operator MyString(string str)
    {
        return new MyString(str);
    }
    Jusqu'ici tout va bien dans le meilleur des mondes.


    Dans une autre classe j'ai un membre et une proprtiété de type MyString:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MyString mMyString;
    public MyString myString 
    {
        get { return mMyString; }    
        set { mMyString = value; }
    }
    Toujours dans cette autre classe j'ai un tableau qui contient une référence au membre mMyString (obtenu par réfléxion sur la propriété myString).


    Le problème: quand j'utilise l'opérateur implicite d'affectation. par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyString test = new MyString();
    test = "toto";

    Il se crée un nouvelle instance de MyString qui sera evidemment différente de celle contenue dans le tableau cité plus haut.

    Est-il possible d'une manière ou d'une autre de forcer la nouvelle instance à "ecraser" l'ancienne et prendre sa référence? (réflexion? unmanaged?..)

    Le probème est contournable en ajoutant un propriété value à MyString et en affectant de manière classique, mais sachant que je "wrappe" la plupart des types de bases j'aimerai vraiment garder l'affectation implicite pour gagner en lisibilité.

    merci pour votre aide.
    XOR Onlava, Onlava

  2. #2
    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
    Les chaînes sont gérées de façon très particulières par le framework : ce sont des objets immuables. Donc le seul moyen pour une référence de chaîne de changer, c'est de pointer vers une autre chaîne. Ce sont des classes qui se comportent comme des structs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string chaine1 = "toto";
    string chaine2 = chaine1;
    chaine1 = "bob"; // chaine2 vaut toujours "toto".
    De plus, pourquoi vouloir avoir une string personnalisée ?
    ಠ_ಠ

  3. #3
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    Salut Guulh, merci pour ta réponse.

    Les chaînes sont gérées de façon très particulières par le framework : ce sont des objets immuables. Donc le seul moyen pour une référence de chaîne de changer, c'est de pointer vers une autre chaîne. Ce sont des classes qui se comportent comme des structs.
    Malhereusement je crois pas que cela soit le problème ici C'est bien lors de la création d'un nouvel objet (dans l'opérateur implicite) que ma référence est remplacée.
    Le comportement est le même avec des objects englobant des valeurs numériques.

    De plus, pourquoi vouloir avoir une string personnalisée ?
    J'englobe les types de base pour faire un système de serialisation perso.
    XOR Onlava, Onlava

  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
    Je vois pas bien comment résoudre ton souci. Grosso modo, les string sont comme des structs, et tu ne peux pas référencer une propriété de type struct d'un objet. Ce qu'il te faudrait, ça serait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A
    {
    public string Chaine {get; set; }
    }
     
    class B
    {
    private A a;
    public string LaChaineDeA {return a.Chaine; } // aller recherche à chaque fois
    }
    C'est à ma connaissance le seul moyen. Très contraignant certes
    ಠ_ಠ

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    J'ai l'impression que le problème est dans la compréhension de ce qu'il se passe en caché.

    Tout n'est que pointeur !!!!

    Soit a et b deux pointeurs et "toto", et "titi" deux chaines de caractères.
    "toto" est contenu dans la case memoire c1 et "titi" dans la case menu c2.
    La case mémoire représentant a contient l'adresse de c1, et pour b l'adresse de c2.

    si l'on veut que a contienne l'adresse de c2, rien de plus simple a = "titi".

    maintenant si j'ai bien compris, lorsque tu crée b tu veux que a pointe sur ce que référence b ?
    Alors pkoi ne pas faire simple et dire que a = ce que ref b après création de b
    voir même faire a = new mystring ?

    Note : a est une case de ton tableau et b -> test
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

Discussions similaires

  1. Réponses: 9
    Dernier message: 31/03/2011, 16h32
  2. Réponses: 8
    Dernier message: 11/07/2006, 17h27
  3. [VB6] faire référence à un objet situé sur un autre form
    Par coyott dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/05/2006, 15h13
  4. Référence à un objet existant depuis une classe
    Par Adrenalys dans le forum ASP
    Réponses: 2
    Dernier message: 21/07/2005, 00h44

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