вернуть новую строку vs .ToString () - PullRequest
6 голосов
/ 06 апреля 2010

Возьмите следующий код:

    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 ]

6 голосов
/ 06 апреля 2010

Проще говоря, потому что вызов ToString () для массива char дает вам

System.Char []

Попробуйте

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

Вы не получите Hello World

Также вызов Array. Обращение к обратным строкам - плохая идея, Тони и Джон упоминают об этом в своей - теперь известной - презентации переполнения стека

2 голосов
/ 06 апреля 2010

Второй просто вызывает ToString для экземпляра массива char, тогда как первый использует конструктор строк для получения строки из массива char. Они действительно не имеют ничего общего друг с другом.

0 голосов
/ 06 апреля 2010

Вот 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         
0 голосов
/ 06 апреля 2010

Массив символов имеет более быстрый / оптимизированный внешний вызов CLR в конструкторе строк, поэтому в этом случае это более быстрая операция.

String имеет специальный конструктор для этого:

[MethodImpl(MethodImplOptions.InternalCall)]
public extern String(char[] value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...