string.Split()默认按空白字符分割且跳过空项;显式指定分隔符需用char[]或string[]重载,并通过StringSplitOptions控制空项;性能敏感场景推荐Span.Split。

Split 方法的基本用法和默认行为
string.Split() 是 C# 中最常用的字符串分割方法,但它默认按空白字符(空格、制表符、换行等)拆分,且会跳过空项。如果你传入 null 或不传参数,它就走这个逻辑:
string text = "a b\tc\n"; string[] parts = text.Split(); // 结果是 ["a", "b", "c"],中间所有空白都被合并处理
这容易让人误以为它“按空格切”,其实它识别的是 char.IsWhiteSpace() 范围内的所有字符。如果想严格按空格切,必须显式传入 new char[] { ' ' }。
按指定字符或字符串分割,控制空项保留
实际开发中更常见的是按逗号、竖线或固定分隔符切,这时要小心空项处理——比如 "a,,b" 默认会变成 ["a", "b"],丢掉中间的空字符串。
- 用
StringSplitOptions.None保留所有结果项(含空字符串) - 用
StringSplitOptions.RemoveEmptyEntries(默认)跳过空项 - 若按字符串分割(如
"||"),必须用string[].Split(new string[] { "||" }, StringSplitOptions.None),不能直接传"||"
string data = "apple||banana|||cherry";
string[] result = data.Split(new string[] { "||" }, StringSplitOptions.None);
// result[2] 是空字符串 "",result[3] 是 "cherry"性能与 Unicode 注意点:避免用 params char[] 重载切长文本
当你写 text.Split('a', 'b', 'c'),编译器调用的是 params char[] 重载,它会把每个字符当作独立分隔符(即“遇到 a 或 b 或 c 就切”)。这在语义上常不是你想要的,而且对大字符串有额外数组分配开销。
- 想按多个不同字符切(如空白+标点),用
char.IsSeparator()或正则更清晰 - 想按固定字符串切(如
"\r\n"),别错写成text.Split('\r', '\n')——那会把"\r\n"拆成两段,且中间内容错位 - .NET 6+ 推荐优先用
Split(char, StringSplitOptions)或Split(string[], StringSplitOptions)显式重载,避免隐式转换歧义
替代方案:Span.Split 和 ReadOnlySpan
对性能敏感场景(如高频日志解析),Span 版本可避免堆分配:
ReadOnlySpanspan = "a,b,c".AsSpan(); var parts = span.Split(','); // 返回 ReadOnlySpan [],每个元素仍是 Span // 注意:parts[i].ToString() 才能转成 string,但频繁调用仍可能触发分配
它不支持字符串分隔符,也不接受 StringSplitOptions,空项总是保留。真正零分配需配合栈上缓存或预分配数组,这点容易被文档忽略。










