2014-09-02 7 views
5

Ich fragte mich kürzlich, wo string den + -Operator überlastet. Die einzigen Methoden, die ich sehen kann, sind == and !=. Warum können zwei Strings mit + verkettet werden, auch wenn dieser Operator nicht überladen ist? Ist das nur ein Magic Compiler Trick oder fehle ich etwas? Wenn Ersteres, warum wurde Schnur so entworfen?Wo ist String überladen + Operator für String-Verkettung?

Diese Frage wurde von this gestellt. Es ist schwierig, jemandem zu erklären, dass er + nicht verwenden kann, um zwei Objekte zu verketten, da object diesen Operator nicht überlastet, wenn string sich nicht um das Überladen von Operatoren kümmert.

+0

Ganz ähnlich: [C# + Operator ruft string.concat Funktion?] (Http://stackoverflow.com/questions/13617707/c-sharp-operator-calls-string-concat-function) –

+1

@ SonerGönül: ja, Jetzt habe ich auch einige Fragen wie [this] (http://stackoverflow.com/questions/10341188/string-concatenation-using-operator) gefunden. Ich fragte mich auch, warum ich nicht ein Duplikat gefunden habe, bevor ich diese Frage gestellt habe. –

+2

Zum Thema: Beachten Sie, dass die CLR viele Sprachen unterstützt. Einige wollen vielleicht nicht der zweifelhaften Entscheidung von C# folgen, '+' für die Verkettung von Strings mit beliebigen Objekten zu verwenden. – CodesInChaos

Antwort

8

String überlastet nicht + Operator. Es ist der C# -Compiler, der den Aufruf in + Operator in String.Concat Methode umwandelt.

Betrachten Sie den folgenden Code ein:

void Main() 
{ 
    string s1 = ""; 
    string s2 = ""; 

    bool b1 = s1 == s2; 
    string s3 = s1 + s2; 
} 

Erzeugt die IL

IL_0001: ldstr  "" 
IL_0006: stloc.0  // s1 
IL_0007: ldstr  "" 
IL_000C: stloc.1  // s2 
IL_000D: ldloc.0  // s1 
IL_000E: ldloc.1  // s2 
IL_000F: call  System.String.op_Equality //Call to operator 
IL_0014: stloc.2  // b1 
IL_0015: ldloc.0  // s1 
IL_0016: ldloc.1  // s2 
IL_0017: call  System.String.Concat // No operator call, Directly calls Concat 
IL_001C: stloc.3  // s3 

Spec dies nennt 7.7.4 Addition operator hier aus, obwohl es nicht spricht über Aufruf String.Concat tut. Wir können davon ausgehen, dass es sich um Implementierungsdetails handelt.

+1

Können wir eine definitive Referenz haben, die das beweist? – spender

+0

@spender Bär mit mir :) Arbeiten daran –

+0

Danke. Ist das auch irgendwo dokumentiert? Jon erwähnt in [dieser Antwort] auch den Grund für diese Implementierung (http://stackoverflow.com/questions/10341188/string-concatenation-using-operator). –

1

Dieses Zitat ist von C# 5.0 Specification 7.8.4 Addition operator

String-Verkettung:

string operator +(string x, string y); 
string operator +(string x, object y); 
string operator +(object x, string y); 

Diese Überlastungen des binären + Operator String Verkettung durchführen. Wenn ein Operand der Verkettung von Zeichenfolgen null ist, wird eine leere Zeichenfolge ersetzt. Andernfalls wird ein beliebiges Nicht-String-Argument in seine Zeichenfolgendarstellung konvertiert, indem die virtuelle ToString-Methode aufgerufen wird, die vom Typ Objekt geerbt wurde. Wenn ToString null zurückgibt, wird eine leere Zeichenfolge ersetzt.

bin ich nicht sicher, warum Nennungen über ist obwohl Überlastung .. Da wir keine Betreiber Überlastungen sehen.

+2

Dies sind Überlastungen auf dem C# -Niveau, nur nicht auf dem CLR-Niveau. – CodesInChaos