2008-09-16 9 views
9

J'ai une fonction qui prend, entre autres, un paramètre déclaré int privateCount. Lorsque je veux appeler ToString() sur ce paramètre, ReSharper le grise et le marque comme un appel redondant. Donc, curieux comme je suis, je supprime le ToString(), et le code construit toujours!Appel redondant à Object.ToString()

Comment un compilateur C# permet cela, où str est une chaîne?

str += privateCount + ...

Répondre

18

L'opérateur + pour la chaîne est surchargée pour appeler String.Concat passant sur le côté gauche et à droite de l'expression. Ainsi:

string x = "123" + 45; 

se compile à:

String.Concat("123", 45); 

Depuis String.Concat prend deux objets, le côté droit (45) est emballé puis ToString() est appelée sur elle. Notez que cette "surcharge" n'est pas due à une surcharge de l'opérateur dans la langue (ce n'est pas une méthode nommée op_Addition) mais est gérée par le compilateur. C# convertit automatiquement les objets en chaînes pour vous.

2

Considérez cette ligne de code:

aString = aString + 23; 

Ceci est valide C#; il compile jusqu'à un appel à String.Concat(), qui prend deux objets comme arguments. Ces objets sont automatiquement convertis en objets chaîne pour vous.

La même chose se produit lorsque vous écrivez:

aString += 23; 

Encore une fois, cette compile jusqu'à la même appel à String.Concat(); c'est juste écrit différemment.

2

Ceci est une mauvaise pratique valide, car vous devez réfléchir à deux fois si la variable est une chaîne ou un int. Et si la variable s'appelait myInt?

myInt = myInt + 23; 

est-il plus lisible et compréhensible sous cette forme?

myInt = mInt + "23"; 

ou même:

myInt = string.Format("{0}{1}", myInt, 23); 

Nous savons à partir du code qu'il est une chaîne et non un entier.

8

Ce n'est pas seulement une mauvaise pratique, mais aussi moins performant: L'entier doit être encadré car String.Concat attend un objet alors que int.ToString() ne nécessite pas de boxe.

+0

Avez-vous réellement mesuré la différence de performance? –

+5

Jeffrey Richter a écrit à ce sujet dans son célèbre livre "CLR via C#" (page 135f). –

+1

Mais cela soulève une question. Si c'est une mauvaise pratique et moins performant, pourquoi ReSharper le recommande-t-il? – Rolf

Questions connexes