2010-04-06 19 views
5

den folgenden Code Nehmen:return new String vs .ToString()

public static string ReverseIt(string myString) 
    { 
     char[] foo = myString.ToCharArray(); 
     Array.Reverse(foo); 
     return new string(foo); 
    } 

Ich verstehe, dass Strings unveränderlich sind, aber was ich nicht verstehe ist, warum eine neue Zeichenfolge aufgerufen werden muss

return new string(foo); 

statt

return foo.ToString(); 

ich habe es etwas mit Zusammenbauen der CharArray zu tun hat, zu übernehmen (aber das ist nur ein gu ess).

Was ist der Unterschied zwischen den beiden und woher wissen Sie, wann eine neue Zeichenfolge zurückgegeben werden soll, anstatt eine System.String zurückzugeben, die das aktuelle Objekt darstellt?

Antwort

-1

Ein Array von Zeichen hat einen schnelleren/optimierten externen Aufruf der CLR im Zeichenfolgenkonstruktor. In diesem Fall ist es also eine schnellere Operation.

String hat einen spezifischen Konstruktor für diesen:

[MethodImpl(MethodImplOptions.InternalCall)] 
public extern String(char[] value); 
+1

ich, dass der Anruf tatsächlich schneller zu .ToString() erraten würde, aber das ist unwichtig, da es nicht dasselbe tut wie der String-Konstruktor. –

2

Die zweite ruft nur ToString auf einer Instanz von char-Array, während die ersten Zeichenfolge einen Konstruktor verwendet eine Zeichenfolge aus einem char-Array zu erhalten. Sie haben wirklich nichts miteinander zu tun.

0

Hier ist die IL für die 2 Funktionen:

private string test(String myString){ 

     char[] foo = myString.ToCharArray(); 
     Array.Reverse(foo); 
     return new string(foo); 
} 


test: 
IL_0000: nop   
IL_0001: ldarg.1  
IL_0002: callvirt System.String.ToCharArray 
IL_0007: stloc.0  
IL_0008: ldloc.0  
IL_0009: call  System.Array.Reverse 
IL_000E: nop   
IL_000F: ldloc.0  
IL_0010: newobj  System.String..ctor 
IL_0015: stloc.1  
IL_0016: br.s  IL_0018 
IL_0018: ldloc.1  
IL_0019: ret   


private string tess(String myString) 
{ 

     char[] foo = myString.ToCharArray(); 
     Array.Reverse(foo); 
     return foo.ToString(); 
} 

tess: 
IL_0000: nop   
IL_0001: ldarg.1  
IL_0002: callvirt System.String.ToCharArray 
IL_0007: stloc.0  
IL_0008: ldloc.0  
IL_0009: call  System.Array.Reverse 
IL_000E: nop   
IL_000F: ldloc.0  
IL_0010: callvirt System.Object.ToString 
IL_0015: stloc.1  
IL_0016: br.s  IL_0018 
IL_0018: ldloc.1  
IL_0019: ret