53 votes

String = string + int : Qu'est-ce qui se cache derrière les coulisses ?

En C#, vous pouvez concaténer implicitement une chaîne de caractères et, disons, un entier :

string sth = "quelque chose" + 0;

Mes questions sont :

  1. Pourquoi, en supposant que vous pouvez concaténer implicitement une chaîne de caractères et un entier, C# empêche d'initialiser les chaînes de la manière suivante :

    string sth = 0; // Erreur : Impossible de convertir le type source 'int' en type cible 'string'
  2. Comment C# convertit 0 en chaîne de caractères. Est-ce 0.ToString() ou (string)0 ou autre chose ?

  3. Comment trouver une réponse à la question précédente ?

55voto

SLaks Points 391154

Il se compile en un appel à String.Concat(object, object), comme ceci :

string sth = String.Concat("something", 0);

(Notez que cette ligne particulière sera en fait optimisée par le compilateur)

Cette méthode est définie comme suit : (extraite de la source de référence .Net)

public static String Concat(Object arg0, Object arg1) {
    if (arg0==null) {
        arg0 = String.Empty; 
    }

    if (arg1==null) { 
        arg1 = String.Empty;
    } 
    return Concat(arg0.ToString(), arg1.ToString());
}

(Cela appelle String.Concat(string, string))


Pour découvrir ceci, vous pouvez utiliser ildasm, ou Reflector (en IL ou en C# sans optimisations) pour voir à quoi la ligne + se compile.

22voto

Jon Skeet Points 692016

Cela est spécifié dans la section 7.8.4 de la spécification C# 4 :

Pour une opération de la forme x + y, la résolution de surcharge d'opérateur binaire (§7.3.4) est appliquée pour sélectionner une implémentation d'opérateur spécifique. Les opérandes sont convertis en les types de paramètres de l'opérateur sélectionné, et le type du résultat est le type de retour de l'opérateur.

Les opérateurs d'addition prédéfinis sont listés ci-dessous. Pour les types numériques et énumération, les opérateurs d'addition prédéfinis calculent la somme des deux opérandes. Quand un ou les deux opérandes sont de type chaîne de caractères, les opérateurs d'addition prédéfinis concatènent la représentation en chaîne de caractères des opérandes.

La dernière phrase est la plus pertinente dans cette situation.

Ensuite plus tard :

Concaténation de chaîne de caractères

string operator +(string x, string y);

string operator +(string x, object y);

string operator +(object x, string y);

Ces surcharges de l'opérateur binaire + effectuent une concaténation de chaîne de caractères. Si un opérande de la concaténation de chaîne de caractères est nul, une chaîne vide est substituée. Sinon, tout argument non une chaîne de caractères est converti en sa représentation de chaîne de caractères en invoquant la méthode virtuelle ToString héritée du type objet. Si ToString retourne null, une chaîne vide est substituée.

Cela spécifie comment l'entier est converti en une chaîne de caractères.

Et le résultat :

Le résultat de l'opérateur de concaténation de chaîne de caractères est une chaîne de caractères qui se compose des caractères de l'opérande de gauche suivis des caractères de l'opérande de droite. L'opérateur de concaténation de chaîne de caractères ne retourne jamais une valeur nulle.

La méthode effective de la concaténation est spécifique à l'implémentation, mais comme indiqué dans d'autres réponses, l'implémentation MS utilise string.Concat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X