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 :

String.Intern question sur le choix de la référence


Sujet :

C#

  1. #1
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut String.Intern question sur le choix de la référence
    Bonsoir,

    Je suis entrain de découvrir String.Intern.

    Histoire de me faire la main j'ai repris l'exemple de la MSDN et je l'ai retravaillé et je suis tombé sur un cas que je ne comprend pas.

    Code Exemple fonctionnel : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    string s1 = new StringBuilder().Append("My").Append("Test").ToString();
    string s2 = String.Intern(s1);
     
    if ((object) s1 == (object) s2)
        Debug.WriteLine("Référence unique !");
    else
        Debug.WriteLine("Référence différente");
     
    // SORTIE : Référence unique !

    Ok, ici le Framework a décidé de prendre pour s2 la même référence que s1.

    Et maintenant, je vais utiliser 2 StringBuilder !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    string s1 = new StringBuilder().Append("My").Append("Test").ToString();
    string s2 = String.Intern(new StringBuilder().Append("My").Append("Test").ToString());
     
    if ((object) s1 == (object) s2)
        Debug.WriteLine("Référence  unique !");
    else
        Debug.WriteLine("Référence différente");
     
    // SORTIE : Référence différente
    Ici les références sont différentes, mais pourquoi ??? Pourtant après avoir créé s1 ce dernier se trouve dans mon spool, et dans la logique s2 devrait donc utiliser la référence de s1.

    Qu'ai-je loupé dans l'histoire ?

    Merci
    Etanne

  2. #2
    Membre éclairé
    Avatar de Etanne
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 469
    Par défaut
    Bonsoir,

    Histoire de répondre à moi même...

    Là où est la première erreur c'est de croire qu'une chaîne est mis automatiquement de le pool interne. Il y a deux façon d'en mettre une :
    1. Les littéraux
      Ils seront ajoutés automatiquement dans le pool au moment où l'on exécuter l'application.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      string val = "Ceci est une chaine"; // automatiquement dans le pool !
    2. En utilisant String.Intern
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      // Ici je demande explicitement de mettre mon string dans le pool :
      string val = String.Intern(new StringBuilder("coucou").ToString());


    -----------------------------------------------------------------------
    Maintenant je vais reprendre mes deux exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Je créé une chaîne (qui sera pas dans le pool car je n'ai pas demandé)
    string s1 = new StringBuilder().Append("My").Append("Test").ToString();
     
    // Ici String.Intern va vérifier si la valeur de s1 se trouve déjà dans le pool.
    // Dans notre cas non, donc le framework va stocker la référence de s1 et va la retourner.
    string s2 = String.Intern(s1);
     
    // Ainsi s2 va utiliser la référence de s1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Je créé une chaîne (qui sera pas dans le pool car je n'ai pas demandé)
    string s1 = new StringBuilder().Append("My").Append("Test").ToString();
    // Je créé un chaîne, et demande au pool un référence, comme la référence n'a jamais été interné (dans le pool) alors s2 va recevoir la référence créé par ToString().
    string s2 = String.Intern(new StringBuilder().Append("My").Append("Test").ToString());
     
    // En conclusion : s1 n'a pas été référencé dans le pool donc sa référence ne pourra jamais être utilisée.
    Etanne

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

Discussions similaires

  1. Vos questions sur les choix et comparaisons de frameworks
    Par Mickael Baron dans le forum Frameworks Web
    Réponses: 1
    Dernier message: 04/03/2013, 12h10
  2. Réponses: 11
    Dernier message: 13/10/2012, 18h59
  3. Vos questions sur les choix et comparaisons de frameworks
    Par Ricky81 dans le forum Frameworks Web
    Réponses: 1
    Dernier message: 12/02/2012, 08h14
  4. Question sur les choix des logiciels pour un MMORPG (sérieux)
    Par Sinnax dans le forum Développement 2D, 3D et Jeux
    Réponses: 11
    Dernier message: 06/01/2011, 20h53
  5. Réponses: 0
    Dernier message: 21/06/2009, 22h06

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