Frage

Ich habe eine Funktion, die unter anderem einen Parameter deklariert als int privateCount nimmt. Wenn ich will ToString () zu diesem param nennen, es ReSharper abgeblendet und markiere es als redundanten Anruf. So neugierig wie ich bin, entferne ich den ToString (), und der Code baut noch!

Wie kann ein C # Compiler erlaubt dies, wobei str ist ein String?

str += privateCount + ...

War es hilfreich?

Lösung

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 diese „Überlastung“ ist in der Sprache nicht über Betreiber Überlastung (aka es keine Methode ist benannt op_Addition), sondern wird vom Compiler behandelt.

Andere Tipps

Es ist nicht nur eine schlechte Praxis, aber auch weniger performant: Die ganze Zahl verpackt werden muss, weil String.Concat ein Objekt expectes während int.ToString () Boxen nicht erforderlich

.

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

aString = aString + 23;

Dies gilt C #; es kompiliert, um einen Anruf zu String.Concat unten (), die zwei Objekte als Argumente annimmt. Diese Objekte werden in String-Objekte für Sie automatisch konvertiert.

Das gleiche geschieht, wenn Sie schreiben:

aString += 23;

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

Dies ist eine gültige schlechte Praxis, wie Sie denken, zweimal müssen, wenn die Variable ein String oder ein int ist. Was passiert, wenn die Variable myInt genannt werden würde?

myInt = myInt + 23;

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

myInt = mInt + "23";

oder auch:

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top