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[])null、new char[0]、 ,或者new string[0]我会得到我期望的结果。我必须承认,不完整的编译器错误未能列出所有不明确的可能性,在某种程度上引导我走上了这条错误的道路。我脑子里有字符串分隔符,所以忽略了(char[])错误消息中的版本并选择了那个(string)版本。
但这留下了一个问题,Split((string)null, ...) 实际上做了什么?文档似乎没有说明任何一种方式,但显然答案是它只是返回单元素数组中的原始字符串。
直接取自 .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)