请使用以下代码:
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?
答案 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);