簡體   English   中英

返回新字符串vs .ToString()

[英]return new string 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有關(但這只是猜測)。

這兩者之間有什么區別,你怎么知道何時返回一個新字符串而不是返回一個表示當前對象的System.String?

很簡單,因為在char數組上調用ToString()會給你

System.Char []

嘗試

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

你沒有得到Hello World

同時調用Array.Reverse來反轉字符串是一個壞主意, Tony和Jon在他們的 - 現在着名的 - Stack Overflow Presentation中提到它

第二個只是在char數組的實例上調用ToString,而第一個使用字符串構造函數從char數組中獲取字符串。 他們真的沒有任何關系。

以下是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         

字符串數組在字符串構造函數中對CLR進行更快速/優化的外部調用,因此在這種情況下,操作更快。

String有一個特定的構造函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM