String[0]与ToCharArray然后Char[0]有什么区别?

4

假设我想获取字符串中的第三个字母。

string s = "cats";

使用s[2]获取值和大多数在线示例使用的区别是什么:

char[] c = s.ToCharArray();
char x = c[2];

2
s[2] 更简洁。在我看来。 - DJ Burb
4个回答

8
  • 如果您需要特定索引处的字符,请使用"cats"[2]
  • 如果您需要将整个字符串作为字符数组使用,请使用"cats".ToCharArray()

1
在你的情况下执行 ToCharArray 会过度杀伤。 - DJ Burb
另外,string.GetEnumerator()(当你使用foreach遍历一个字符串时,每次遍历一个字符)也不会创建字符串的副本。这意味着在许多情况下它仍然比.ToCharArray()更高效。 - Erik
在编写 ReverseString 方法时,使用其中一种方法是否有任何优势? - mildse7en

4
s[2] 方法只是查找字符串中该位置的字符并返回。 s.ToCharArray() 方法分配了一个新的 char[],然后 c[2] 在数组中查找。
如果你只需要单个字符,请使用 s[2] 方法,因为 ToCharArray() 方法会浪费资源。如果你需要将字符串中的所有字符作为 char[] 返回,则 ToCharArray() 方法更加干净,且可能更快(我没有进行基准测试,所以不能保证)。
编辑:
MS.NET 和 Mono 的实现都使用了不安全代码,锁定了内部的 char 和重复的 char[] 并在指针上进行操作。这肯定比为每个字符调用索引器要快得多,也可能比使用枚举器迭代所有字符要快。此外,特别是在将其用作参数的情况下,我发现它更加清晰。
DoSomethingWithCharArray(s.ToCharArray());

vs

int i = 0;
char[] arr = new char[s.Length];
foreach (char c in s)
{
    arr[i] = c;
    i++;
}

DoSomethingWithCharArray(arr);

或者

char[] arr = new char[s.Length];
for (int i = 0; i < s.Length; i++)
{
    arr[i] = s[i];
}

DoSeomthingWithCharArray(arr);

为什么ToCharArray()更好?虽然这是可能的,但我认为应该在这个答案中解释清楚。 - O. R. Mapper
嗯,这比使用s[i]的for循环更简洁,而且可能性能更好,但我没有进行任何基准测试或测试,所以我决定不假设它确实如此。 - Robert Rouhani
好的,感谢您对答案的扩展。我个人认为直接在s上运行for更加简洁,但这并不是很重要。下次当我面临这个决定时,我会尝试了解一些基准测试的 :) - O. R. Mapper
查看.NET参考源代码,它们将内部的char[]和一个重复的char[]都固定住,并调用托管方法wstrcpy,该方法执行一些指针运算。这比使用for循环要快得多。Mono的字符串实现 固定了两个数组并使用了自己托管的memcpy实现。我会写自己的基准测试,但很明显,这两种实现都比为每个字符调用索引器(必须为每个字符固定和取消固定字符串)要快。 - Robert Rouhani

3
区别在于你不必要地创建了一个字符数组。使用s[2]即可。

0

如果你只是读取字符,那么区别只在于稍微更大的内存占用。但是,如果你还想改变一些字符并保留原始字符串,那么利用ToCharArray非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接