为什么";我的,字符串”;.Split(';,';)适用于.NET C#

本文关键字:适用于 NET quot 我的 字符串 为什么 Split | 更新日期: 2023-09-27 18:25:28

为什么"my,string".Split(',')在.NET C#中工作?

根据MSDN,Split的声明是Split(Char[])。MSDN String.Split方法

我假设C#5将单个字符','转换为char[] {','};但我一定错了,因为以下代码不起作用:

static void Main()
{
    GetChar(',');
}
static char GetChar(char[] input)
{
    return input[0];
}

编辑:多亏了Jon Skeet的回答,我把论点改为params char[],它有效地证明了这个概念。

static char GetChar(params char[] input)
{
    return input[0];
}

为什么";我的,字符串”;.Split(';,';)适用于.NET C#

您使用的重载基本上使用参数数组。这就是params部分。编译器会自动将您的单个参数封装到一个数组中。所以这个:

var x = text.Split(',');

相当于:

var x = text.Split(new char[] { ',' });

您也可以为自己的方法使用参数数组,使用params关键字:

static char GetChar(params char[] input)
{
    return input[0];
}

请注意,参数数组必须是最终参数。这就是为什么您使用的重载是Split的仅重载以使用参数数组。看看其他过载:

Split(Char[], Int32)
Split(Char[], StringSplitOptions)
Split(String[], StringSplitOptions)
Split(Char[], Int32, StringSplitOptions)
Split(String[], Int32, StringSplitOptions)

在每种情况下,数组都是第一个参数,因此您必须自己构造一个数组:

var x = text.Split(new char[] { ',' }, 10); // Call the (char[], int) overload

或者使用隐式类型数组:

var x = text.Split(new[] { ',' }, 10); // Call the (char[], int) overload

实际调用的重载就是这个。请注意,页面顶部的标题具有误导性,它实际上使用了params char[]而不是char[]。这允许您将分隔符作为"my, string".Split(',', ' ')传递,而不是让您跳过先使用"my, string".Split(new char[] { ',', ' ' })的环。