tochararray()是最直接安全的字符串转字符数组方式,无需foreach手动填充;它提供全量和截取两个重载,返回新数组不影响原字符串,但频繁调用有性能开销。

string.ToCharArray() 是最直接、安全、推荐的方式,没有例外情况需要绕路。
为什么不用 foreach 遍历字符串再手动填充数组
字符串本身已支持索引访问,且 string 在 C# 中隐式实现了 IEnumerable<char></char>,但手动循环构建数组既冗余又易出错:
- 容易写错边界(比如用
Length - 1当上限) - 多分配一次数组空间(先 new char[n],再逐个赋值)
- 失去
ToCharArray()内部的优化(如内存连续拷贝、避免越界检查等)
除非你要做字符过滤或转换(比如只取字母),否则纯“转为数组”场景下,foreach + 手动收集是画蛇添足。
ToCharArray() 的两个重载怎么选
它有两个常用重载:
-
str.ToCharArray():返回完整副本,最常用 -
str.ToCharArray(int startIndex, int length):截取子段转数组,适合解析固定格式字符串(如取后4位做校验码)
注意:startIndex 和 length 超出范围会直接抛 ArgumentOutOfRangeException,不是静默截断。调试时留意错误堆栈里是否出现这个异常。
转完的数组修改不会影响原字符串
C# 中 string 是不可变类型,ToCharArray() 返回的是全新堆内存上的 char[],例如:
string s = "abc"; char[] arr = s.ToCharArray(); arr[0] = 'x'; Console.WriteLine(s); // 输出 "abc",不是 "xbc" Console.WriteLine(new string(arr)); // 输出 "xbc"
这点常被初学者误认为“引用没断开”,其实不是 bug,是设计使然。如果后续要频繁修改字符,建议直接用 StringBuilder,而不是反复转数组。
真正要注意的是:别在性能敏感路径(比如每帧调用的 Unity 方法)里无节制调用 ToCharArray() —— 它每次都会分配新数组。如果只是读取单个字符,直接用 s[i];如果需多次修改,优先考虑 Span<char></char> 或 ReadOnlySpan<char></char> 避免堆分配。











