2010-04-06 21 views
5

Tome el siguiente código:volver nueva cadena vs .ToString()

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

entiendo que las cadenas son inmutables, pero lo que no entiendo es por qué una nueva cadena necesita ser llamado

return new string(foo); 

en lugar de

return foo.ToString(); 

tengo que asumir que tiene algo que ver con volver a montar el CharArray (pero eso es sólo una gu ess).

¿Cuál es la diferencia entre los dos y, ¿cómo saber cuándo debe regresar una nueva cadena en lugar de devolver un System.String que representa el objeto actual?

Respuesta

-1

Una serie de personajes tiene una llamada externa más rápida/optimizado para el CLR en el constructor de cadena, por lo que en este caso, se trata de una operación más rápida.

String tiene un constructor específico para esto:

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

supongo que la llamada a .ToString() es más rápido, pero que es sin importancia dado que no hace lo mismo que el constructor de cadenas. –

2

La segunda sólo llama a ToString en una instancia de matriz de caracteres, mientras que la primera utiliza un constructor de cadena para obtener una cadena a partir de una matriz de caracteres. Realmente no tienen nada que ver el uno con el otro.

0

Aquí está la IL para las 2 funciones:

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   
Cuestiones relacionadas