Partage
  • Partager sur Facebook
  • Partager sur Twitter

String est-il vraiment un type de référence ?

Sujet résolu
    19 mai 2020 à 20:14:49

    Bonsoir tout le monde,

    En C#, String est une type de référence. Mais j'ai constaté qu'il se comporte comme un type de valeur dans mes exercices de programmation. (Pour éviter alourdir grandement et inutilement ce post, je ne vous joint pas ces exercices en question, si jamais vous en avait besoin n'hésitez pas à me les demander.)

    En faisant des recherches, j'ai vu que String est plus précisément un type de référence intégrés dans ce lien :

    - https://docs.microsoft.com/fr-fr/dotnet/csharp/language-reference/builtin-types/reference-types

    Donc j'aimerais vous demander : En C#, String est-il vraiment un type de référence ? Ou se pourrait-il qu'il soit, en réalité, à la fois un type de référence et un type de valeur comme le suggéreraient son comportement et le fait qu'il soit un type de référence intégrés ?

    Je vous remercie par avance pour vos réponses.

    Je vous souhaite une très bonne soirée.

    Bien cordialement.

    Aclanto

    -
    Edité par aclanto 19 mai 2020 à 20:16:31

    • Partager sur Facebook
    • Partager sur Twitter
      19 mai 2020 à 21:36:02

      Une string n'est pas vraiment/totalement un type valeur (boxing/unboxing, compactage de la mémoire, etc...) mais oui c'est clairement pas un type référence "standard".

      M$ a voulu faire en sorte qu'elle soit bien plus pratique à utiliser qu'en JAVA (avec cette plaie d'"isEquals" partout), en traitant cette classe d'objet de manière totalement différentes du reste des classes du Framework.

      Votre lien, c'est juste pour le syntaxical sugar qu'offre le C# pour ne pas se coller les noms pas très "pratique" du Framework .NET "de base" (sans le syntaxical sugar du C#).

      Mais syntaxical sugar ou pas, les "string" ont un comportement spécifique, mais qui sert à rendre son utilisation plus simple et intuitive qu'en JAVA (au coup de quelques entorses à la sémantique "référence").

      Attention "String", c'est le nom "Framework" (non qualifié) et "string" c'est le nom "sucré" par le C#.

      String/string est un type très spécial, dans le Framework (il y a une usine à gaz de malade dans le Framework juste pour ce seul et unique type), pour que ce type "référence" soit pratique à utiliser, donc pas 100% "référence".

      Mais il est plus proche d'un type référence "classique" que d'un type valeur.

      Il a des spécificités à lui seul, comme le fait de ne pas être garbage-collectée, etc...

      Il est vraiment très spécial.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        22 mai 2020 à 20:41:29

        Bonsoir Bacelar,

        Je te remercie beaucoup pour ton message. :)

        En fait, si j'ai bien compris, string ou String est considéré comme type de référence car je suppose que dans l'espace mémoire il doit être gérer par le tas et non par la pile. Cependant pour un programmeur débutant comme moi, string ou String est très déroutant car dans un programme, il se comporte concrètement comme un type de valeur la plupart du temps si ce n'est peut-être tout le temps, notamment dans un cas comme cela :

         class Program
            {
                static void Main()
                {
                    string nom = "Mike";
                    
                    Console.WriteLine(nom);
                    ChangeNom(nom);
                    Console.WriteLine(nom);
                }
                public static void ChangeNom(string change)
                {
                    change = "Pierre";
                    Console.WriteLine(change);
                }
            }



        Comme quoi on ne le dira jamais assez : Méfions-nous des string ! :ange: :D

        Sur cette plaisanterie, Bacelar, je te souhaite une très bonne soirée ainsi qu'un très bon week-end.

        Bien cordialement.

        Aclanto

        -
        Edité par aclanto 22 mai 2020 à 20:42:43

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2020 à 23:11:28

          En .NET, ce n'est pas vraiment un tas mais plutôt un ensemble de "Pool" d'objets, car il y a un garbage-collector/compacteur.

          En plus, les string disposent de leur propre "pool" car elles sont vraiment traitées différemment même à si bas niveau.

          Il faut mieux prendre des string/String comme des objets références qui ont la super propriété que l'opérateur "=" fait la magie de fonctionner sur le contenu de la chaîne et non sur une "référence".

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            27 mai 2020 à 16:22:06

            • Partager sur Facebook
            • Partager sur Twitter
            Censément, quelqu'un de sensé est censé s'exprimer sensément.
              30 mai 2020 à 21:28:29

              Bonsoir Bacelar Bonsoir Sehnsucht

              Je vous remercie pour vos messages.

              En résumer,  je l'écris, sous votre contrôle, string/String est officiellement un type de référence mais en programmation on le doit considéré comme un type de valeur car il se comporte comme tel.

              Sehnsucht, d'après l'article, dont tu m'as donné le lien, savoir si string/String est un type de référence ce n'est pas important car au fond, on se moque de savoir comment les types sont gérés en mémoire puisque leurs gestions, de tout façon, ne sont pas très claires.

              La question est de savoir si en programmation string /String se comporte vraiment toujours comme un type de valeur ou si il y a des exceptions.

              Par exemple, ce lien ci-dessous nous conseille d'utiliser, dans les structure, des type « primitif » donc sûrement des types de valeurs.

              https://docs.microsoft.com/fr-fr/dotnet/standard/design-guidelines/choosing-between-class-and-struct?redirectedfrom=MSDN

              Donc on peut se demander si il est recommandé, dans celle-ci, d'utiliser le type string/String.

              L’ambiguïté de ce type rend difficile de bien savoir utiliser ce type dans certains cas, notamment pour un programmeur débutant.

              Je vous remercie encore pour vos aides

              Bacelar, Sehnsucht, je vous souhaite un très bon week-end, ainsi qu'une bonne soirée.

              Bien cordialement,

              Aclanto

              -
              Edité par aclanto 30 mai 2020 à 23:33:29

              • Partager sur Facebook
              • Partager sur Twitter
                31 mai 2020 à 2:15:09

                Salut,

                Le fait est que, de manière générale, et quel que soit le langage envisagé, l'utilisation de chaines de caractères (quel que soit le nom ou la sémantique qu'on leur donne) sont une véritable plaie algorithmique et n'ont, de toutes manières, réellement de sens que pour l'humain qui pourra les lire et leur donner un sens.

                Il faut, d'ailleurs, se rappeler que, à la base, un ordinateur est essentiellement destiné à effectuer des opérations mathématiques, à travailler sur des valeurs numériques.

                D'ailleurs, quel que soit le langage utilisé, une chaine de caractères est en réalité représentée par l'indice des différents "glyphes" (que ce soit une lettre, un chiffre, un élément de ponctuation  l'étoile '*' ou le dolars '$' ) dans une table de caractères et que chaque glyphe n'a réellement de sens que ... pour l'humain qui le regarde (et qui pourra l'interpréter).

                Il est donc "logique" de conseiller d'utiliser de préférence des types permettant de représenter des valeurs numériques (qu'elles soient entières ou non, signées ou non, associées à une énumération ou non) plutôt que "cette aberration" qu'est la notion même de chaine de caractères pour représenter les différentes données que l'on veut manipuler ;)

                • Partager sur Facebook
                • Partager sur Twitter
                Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                  2 juin 2020 à 10:36:31

                  >string/String est officiellement un type de référence mais en programmation on le doit considéré comme un type de valeur

                  Non, il se comporte comme un type référence sauf pour des cas dûment spécifiés.

                  C'est un peu le problème du niveau "intermédiaire" de l'apprentissage. Quand on commence à comprendre qu'il y a plein de chose planqués derrière, mais pas si magique.

                  C'est bien d'essayer de comprendre comment est fait ces choses, mais n'oubliez pas que c'est les spécifications (ici, de la BCL de .NET) qui régis le contrat entre votre programme et l'environnement d'exécution. Les implémenteurs des différents framework sont "tenue" de respecter les spécifications mais pas la manière de faire utilisée par tel ou tel autre implémentation du framework.

                  Donc, c'est bien de chercher à comprendre comment "effectivement" les choses sont faites mais attention à ne pas trop généraliser ces connaissances.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    16 juin 2020 à 19:30:36

                    Bonjour tout le monde,

                    Koala01, Bacelar, je vous remercie pour vos réponses excusez-moi de répondre si tard, ces quinze derniers jours ont été chargés pour moi et le temps passe très vite.

                    Donc pour résumer cette discussion, string/String est un type de référence qui se comporte comme un type de référence sauf dans certains cas spécifiques où il se comporte comme un type de valeur.

                    Quand on crée une structure, il vaut mieux éviter utiliser string/String pour implémentation car c'est mieux d'utiliser des types « primitifs » (donc des types de valeurs). Et string/String d'entrée n'est pas un type « primitif » puisque il manipule des caractères qui sont une "aberration" pour les ordinateurs qui n'utilisent de base que des valeurs numériques.

                    Et de toutes façons, comme la gestion des types en mémoire n'est pas aussi simple qu'on pourrais le penser ; il n'est pas très utile de trop creuser le sujet.

                    Je remercie de nouveaux toutes celles et tous ceux qui ont participé à cette discussion.

                    Je souhaite à toutes et à tous une très bonne soirée.

                    Bien cordialement.

                    Aclanto

                    -
                    Edité par aclanto 16 juin 2020 à 19:44:22

                    • Partager sur Facebook
                    • Partager sur Twitter

                    String est-il vraiment un type de référence ?

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown