2008-09-16 9 views
9

Ich habe eine Funktion, die unter anderem einen als deklarierten Parameter int privateCount. Wenn ich ToString() für diesen Parameter aufrufen möchte, wird es von ReSharper grau dargestellt und als redundanter Aufruf markiert. So neugierig wie ich bin, entferne ich die ToString(), und der Code baut immer noch!Redundanter Aufruf von Object.ToString()

Wie kann ein C# -Compiler dies ermöglichen, wobei str eine Zeichenfolge ist?

str += privateCount + ...

Antwort

18

Der Operator + für String ist überlastet String.Concat vorbei in der linken und rechten Seite des Ausdrucks zu nennen. Also:

string x = "123" + 45; 

Ruft zusammengestellt:

String.Concat("123", 45); 

Da String.Concat in zwei Objekten nimmt, die rechte Seite (45) eingerahmt wird und dann ToString() auf sie genannt.

Beachten Sie, dass dieses "Überladen" nicht über das Überladen von Operatoren in der Sprache erfolgt (auch bekannt als op_Addition), sondern vom Compiler.

2

C# konvertiert die Objekte automatisch in Zeichenfolgen für Sie. Betrachten Sie diese Codezeile:

aString = aString + 23; 

Dies ist gültig C#; Es kompiliert bis zu einem Aufruf von String.Concat(), das zwei Objekte als Argumente benötigt. Diese Objekte werden automatisch in String-Objekte für Sie konvertiert.

Das gleiche geschieht, wenn Sie schreiben:

aString += 23; 

Auch dies stellt auf den gleichen Anruf String.Concat nach unten(); es ist nur anders geschrieben.

2

Dies ist eine gültige schlechte Praxis, da Sie zweimal überlegen müssen, ob die Variable eine Zeichenfolge oder ein Int ist. Was wäre, wenn die Variable myInt heißen würde?

myInt = myInt + 23; 

ist es in dieser Form besser lesbar und verständlich?

myInt = mInt + "23"; 

oder sogar:

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

Wir wissen aus dem Code, der es sich um eine Zeichenfolge ist und nicht eine ganze Zahl ist.

8

Es ist nicht nur schlecht, sondern auch weniger performant: Die ganze Zahl muss eingerahmt werden, da String.Concat ein Objekt erwartet, während int.ToString() kein Boxing benötigt.

+0

Haben Sie den Leistungsunterschied tatsächlich gemessen? –

+5

Jeffrey Richter schrieb darüber in seinem berühmten Buch "CLR via C#" (Seite 135f). –

+1

Aber das wirft eine Frage auf. Wenn es schlecht ist und weniger performant ist, warum empfiehlt ReSharper es? – Rolf

Verwandte Themen