C# 字符串[0]vs ToCharArray然后Char[0]

C# 字符串[0]vs ToCharArray然后Char[0],c#,.net,char,C#,.net,Char,假设我想得到字符串中的第三个字母 string s = "cats"; 使用s[2]获取值与, 正如我在网上看到的大多数示例所示: char[] c = s.ToCharArray(); char x = c[2]; 如果在特定索引处需要字符,请使用“cats”[2] 如果需要整个字符串作为字符数组,请使用“cats”.tocharray() 不同之处在于,创建字符数组是不必要的。使用s[2]。方法只需在该位置查找字符并返回 s.ToCharArray()方法分配一个新的char[],然后

假设我想得到字符串中的第三个字母

string s = "cats";
使用s[2]获取值与, 正如我在网上看到的大多数示例所示:

char[] c = s.ToCharArray();
char x = c[2];
  • 如果在特定索引处需要字符,请使用
    “cats”[2]
  • 如果需要整个字符串作为字符数组,请使用
    “cats”.tocharray()

不同之处在于,创建字符数组是不必要的。使用s[2]。

方法只需在该位置查找字符并返回

s.ToCharArray()
方法分配一个新的
char[]
,然后
c[2]
在数组中查找它

如果只需要一个字符,请使用
s[2]
方法,因为
tocharray()
方法是浪费的。如果您需要字符串中的所有字符作为
char[]
的形式,那么
tocharray()
方法更干净,可能更快(我还没有做过任何基准测试,所以不要让我这么做)

编辑

MS.NET和Mono的
string.tocharray()
实现都使用了不安全的代码,这些代码固定了内部
char
和重复的
char[]
,并对指针进行操作。这肯定比为每个字符调用索引器要快,而且可能比使用枚举器迭代所有字符要快。另外,我发现它更干净,尤其是在它被用作参数的情况下:

DoSomethingWithCharArray(s.ToCharArray());
vs

char[]arr=新字符[s.Length];
对于(int i=0;i
如果您只是在读取字符,那么差异只是稍微大一点的内存占用。但是,如果您还想更改某些字符并保留原始字符串,那么利用
ToCharArray
非常有用。

s[2]更干净。依我看。在您的情况下执行tocharray也会有过大的杀伤力,
string.GetEnumerator()
(当您通过
string
char
一次创建一个字符串副本时)。这意味着在许多情况下,它仍然比
.tocharray()
更有效。在反向限制方法中,两者之间有什么好处吗?为什么
tocharray()
更好?这是可能的,但我认为应该在这个答案中加以解释。好吧,它比带有
s[I]
的for循环更干净,而且它的性能可能更好,但我没有做过任何基准测试或测试,所以我决定不假设它会。好的,感谢答案的扩展。我个人将直接考虑<代码> > <代码>直接在<代码> s>代码>清洁器上,但这并不重要。当我下次面对这个决定时,我将尝试了解一些基准测试:)查看.NET参考源,它们同时锁定内部
char[]
和重复的
char[]
并调用托管方法
wstrcpy
,该方法执行一些指针数学运算。这将比for循环快得多。固定两个阵列并使用它们自己的
memcpy
托管实现。我会编写自己的基准测试,但很明显,这两种实现都比为每个字符调用索引器(必须为每个字符固定和取消固定字符串)要快
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);