2010-04-06 75 views
5

看看下面的代码:返回新的字符串VS的ToString()

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

我明白字符串是不可改变的,但我不明白的是为什么一个新字符串需要调用

return new string(foo); 

代替

return foo.ToString(); 

我必须假设它是与重组的CharArray(不过那只是一个区ESS)。

这两者之间的区别是什么,你如何知道何时返回一个新的字符串,而不是返回一个代表当前对象的System.String?

回答

-1

字符数组对字符串构造函数中的CLR有更快的/优化的外部调用,所以在这种情况下,这是一个更快的操作。

String具有用于此特定构造:

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

我猜调用的ToString()实际上要快,但毕竟是不重要的,因为它不会和字符串构造函数做同样的事情。 – 2010-04-06 15:11:11

2

第二只是调用对char阵列的一个实例的ToString,而第一使用字符串构造,以获得从一个字符数组的字符串。他们真的没有任何关系。

0

这里是IL为2层的功能:

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