假设我想获取字符串中的第三个字母。
string s = "cats";
使用s[2]获取值和大多数在线示例使用的区别是什么:
char[] c = s.ToCharArray();
char x = c[2];
"cats"[2]
"cats".ToCharArray()
string.GetEnumerator()
(当你使用foreach
遍历一个字符串时,每次遍历一个字符)也不会创建字符串的副本。这意味着在许多情况下它仍然比.ToCharArray()
更高效。 - Eriks[2]
方法只是查找字符串中该位置的字符并返回。
s.ToCharArray()
方法分配了一个新的 char[]
,然后 c[2]
在数组中查找。s[2]
方法,因为 ToCharArray()
方法会浪费资源。如果你需要将字符串中的所有字符作为 char[]
返回,则 ToCharArray()
方法更加干净,且可能更快(我没有进行基准测试,所以不能保证)。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. Mappers[i]
的for循环更简洁,而且可能性能更好,但我没有进行任何基准测试或测试,所以我决定不假设它确实如此。 - Robert Rouhanis
上运行for
更加简洁,但这并不是很重要。下次当我面临这个决定时,我会尝试了解一些基准测试的 :) - O. R. Mapperchar[]
和一个重复的char[]
都固定住,并调用托管方法wstrcpy
,该方法执行一些指针运算。这比使用for循环要快得多。Mono的字符串实现 固定了两个数组并使用了自己托管的memcpy
实现。我会写自己的基准测试,但很明显,这两种实现都比为每个字符调用索引器(必须为每个字符固定和取消固定字符串)要快。 - Robert Rouhani如果你只是读取字符,那么区别只在于稍微更大的内存占用。但是,如果你还想改变一些字符并保留原始字符串,那么利用ToCharArray
非常有用。