返回新字符串vs .ToString()

时间:2010-04-06 14:55:00

标签: c# string arrays

请使用以下代码:

    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有关(但这只是猜测)。

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

4 个答案:

答案 0 :(得分:6)

很简单,因为在char数组上调用ToString()会给你

  

System.Char []

尝试

    char[] ca = "Hello world".ToCharArray();
    Console.WriteLine("{0}", ca);

你没有得到Hello World

同样调用Array.Reverse来反转字符串是一个坏主意,Tony and Jon mention it in their - now famous - Stack Overflow Presentation

答案 1 :(得分:2)

第二个只是在char数组的实例上调用ToString,而第一个使用字符串构造函数从char数组中获取字符串。他们真的没有任何关系。

答案 2 :(得分:0)

以下是2个函数的IL:

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         

答案 3 :(得分:-1)

字符数组在字符串构造函数中对CLR进行了更快速/优化的外部调用,因此在这种情况下,操作更快。

String有一个特定的构造函数:

[MethodImpl(MethodImplOptions.InternalCall)]
public extern String(char[] value);
相关问题