c# String.Split((string)null, , StringSplitOptions.RemoveEmptyEntries) 不按空格分割,它有什么作用?

Kev*_*tin 2 .net c# whitespace

我有代码(在本例中针对 .NET Core 3.1),我想在空格上分割字符串。我的草稿代码是

string s = "A B";
var parts = s.Split(null, StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨第一个参数是 a(char[])或 a之间存在歧义(string?)。我选择将 null 转换为字符串:

string s = "A B";
var parts = s.Split((string)null, StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)

然而,结果却出人意料地是一个字符串数组"A B"

事实证明,通过对 Split 的所有重载进行重复文档的研究,我们发现这个签名(采用单个字符串分隔符的签名)是唯一一个空分隔符并不意味着空格处中断的签名。

如果我编码(string[])null(char[])nullnew char[0]、 ,或者new string[0]我会得到我期望的结果。我必须承认,不完整的编译器错误未能列出所有不明确的可能性,在某种程度上引导我走上了这条错误的道路。我脑子里有字符串分隔符,所以忽略了(char[])错误消息中的版本并选择了那个(string)版本。

但这留下了一个问题,Split((string)null, ...) 实际上做了什么?文档似乎没有说明任何一种方式,但显然答案是它只是返回单元素数组中的原始字符串。

Rya*_*son 5

直接取自 .Net Standard 2.1 的源代码,其中包括 .Net Core 3.1, 的定义Split(string? separator, StringSplitOptions options = StringSplitOptions.None)位于source.dot.net

public string[] Split(string? separator, StringSplitOptions options = StringSplitOptions.None)
{
    return SplitInternal(separator ?? string.Empty, null, int.MaxValue, options);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它检查null并传递string.Empty给 method SplitInternal,因此为了回答您的问题,它会分割一个空字符串,从而生成原始字符串。

这些产生相同的结果:

string s = "Hello World";   
Console.WriteLine(s.Split((string)null, StringSplitOptions.RemoveEmptyEntries)[0]); //prints Hello World
Console.WriteLine(s.Split(string.Empty, StringSplitOptions.RemoveEmptyEntries)[0]); //prints Hello World
Run Code Online (Sandbox Code Playgroud)