new string(char[]) 是字符数组转字符串的最快、最安全、最语义明确的方式,底层零拷贝,支持子范围重载,需主动防护 null,空数组合法,生成字符串与原数组完全解耦。

直接用 new string(char[]) 构造函数,最快、最安全、最符合语义——别用 string.Join 或 string.Concat 去“拼接”单个字符数组,那是画蛇添足。
为什么 new string(char[]) 是首选
这是 C# 专为字符数组转字符串设计的构造函数,底层零拷贝(在 .NET Core 3.0+ 和 .NET 5+ 中,若数组未被修改,会直接引用内部缓冲区),性能最优,语义最清晰。
常见错误是误以为必须用 string.Join("", arr),这不仅多分配一个空字符串对象,还要遍历数组做分隔逻辑,纯属冗余。
-
new string(char[])要求数组不能为null,否则抛ArgumentNullException - 它不处理 Unicode 替代对(surrogate pairs)的校验——但正常由
char[]表示的字符串本就应已合法,无需额外检查 - 不支持指定起始索引和长度(如需子范围转换,请用
new string(char[], int, int)重载)
需要截取部分字符时用三参数构造函数
当只取数组前 N 个字符或中间一段时,避免先 Array.Copy 再构造,直接用带 offset 和 length 的重载:
char[] chars = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };
string s = new string(chars, 0, 5); // "Hello"
string t = new string(chars, 6, 5); // "World"这个重载同样高效,且比 new string(chars).Substring(...) 少一次完整字符串分配。
- 如果
offset或length超出数组边界,抛ArgumentException - 该重载在 .NET Framework 2.0+ 和所有现代 .NET 版本中都可用,无兼容性问题
遇到 null 或空数组要主动防护
new string((char[])null) 会立即抛异常,而空数组 new char[0] 是合法输入,返回空字符串 ""。生产代码中常忽略判空,导致上游 null 流入后崩掉。
推荐写法(简洁且明确):
string ToSafeString(char[] chars) => chars is null ? string.Empty : new string(chars);
- 不要用
chars?.Length == 0 ? "" : new string(chars)——空数组可直接构造,没必要分支 - 如果调用方可能传
Span<char>,优先考虑span.ToString()(.NET Core 2.1+),它比转成数组再构造更轻量
真正容易被忽略的是:字符数组一旦被构造为字符串,就与原数组彻底解耦;后续修改数组内容,不会影响已生成的字符串——这点看似常识,但在共享缓冲区或 unsafe 场景下,有人会误以为存在引用关系。


















