【发布时间】:2013-01-02 16:17:13
【问题描述】:
假设我想获取字符串中的第三个字母。
string s = "cats";
使用s[2]获取值有什么区别, 正如我在网上看到的大多数示例:
char[] c = s.ToCharArray();
char x = c[2];
【问题讨论】:
-
s[2] 更干净。在我看来
假设我想获取字符串中的第三个字母。
string s = "cats";
使用s[2]获取值有什么区别, 正如我在网上看到的大多数示例:
char[] c = s.ToCharArray();
char x = c[2];
【问题讨论】:
"cats"[2]
"cats".ToCharArray()
【讨论】:
string.GetEnumerator()(当您通过foreach 一次通过string、char 时)也不会创建字符串的副本。这意味着在许多情况下它仍然比.ToCharArray() 更有效。
不同之处在于您不必要地创建了一个字符数组。使用 s[2]。
【讨论】:
s[2] 方法只是在该位置查找字符并返回它。
s.ToCharArray(); 方法分配一个新的char[],然后c[2] 在数组中查找它。
如果您只需要一个字符,请使用s[2] 方法,因为ToCharArray() 方法很浪费。如果您需要将字符串中的所有字符作为char[],那么ToCharArray() 方法更简洁,可能更快(我没有做过任何基准测试,所以不要坚持) .
编辑:
MS.NET 和 Mono 的 string.ToCharArray() 实现都使用不安全代码来固定内部 char 和重复的 char[] 并对指针进行操作。这绝对比为每个字符调用索引器要快,并且可能比使用枚举器遍历所有字符要快。另外,我发现它更简洁,尤其是在它用作参数的情况下:
DoSomethingWithCharArray(s.ToCharArray());
对
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()更好?这是可能的,但我认为应该在这个答案中解释。
s[i] 的 for 循环更干净,而且它可能性能更好,但我没有进行任何基准测试或测试,所以我决定不假设确实如此。
s 清洁器上运行for,但这并不重要。当我下次面临决定时,我会尝试找出一些基准:)
char[] 和重复的 char[] 并调用托管方法 wstrcpy 进行一些指针数学运算。这将比 for 循环快得多。 Mono's string implementation 固定两个数组并使用它们自己的托管实现 memcpy。我会编写自己的基准测试,但很明显,这两种实现都比为每个字符调用索引器更快(它必须为每个字符固定和取消固定字符串)
如果您只是读取字符,则差异只是内存占用稍大。但是,如果您还想更改某些字符并保留原始字符串,那么使用ToCharArray 非常有用。
【讨论】: