看到了一段关于使用参数数组的方法和使用可选参数的方法的比较,琢磨琢磨,并不深,思维最重要!
先来看一段代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 参数数组
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Program.Sum(1));
Console.WriteLine(Program.Sum(1, 2));
Console.WriteLine(Program.Sum(1, 2, 3));
Console.WriteLine(Program.Sum(1, 2, 3, 4));
Console.WriteLine(Program.Sum(1, 2, 3, 4, 5));
Console.WriteLine(Program.Sum(1, 2, 3, 4, 5, 6));
Console.WriteLine(Program.Sum(1, 2, 3, 4, 5, 6, 7));
Console.WriteLine(Program.Sum(1, 2, 3, 4, 5, 6, 7, 8));
}
public static int Sum(params int[] paramList)
{
Console.WriteLine("using parameter list");
if (paramList == null)
{
throw new ArgumentException("Util.Sum:参数列表为null");
}
if (paramList.Length == 0)
{
throw new ArgumentException("Util.Sum:空白参数列表");
}
int sumTotal = 0;
foreach (int i in paramList)
{
sumTotal += i;
}
return sumTotal;
}
public static int Sum(int Param1 = 0, int Param2 = 0, int Param3 = 0, int Param4 = 0)
{
Console.WriteLine("using optional parameters");
int sumTotal = Param1 + Param2 + Param3 + Param4;
return sumTotal;
}
}
}
可以看到在 class Program 下对方法 Sum 进行了重载,先采用的是可选参数的方法,之后采用的是含有4个参数的方法,然后在 Main 函数里调用方法。
调用的方法的参数个数由1到8,那么结果会怎么样?
猜一下:当有4个参数的时候应该会优先选用带有4个参数的方法,毕竟匹配更好;至于其他的应该都选用可选参数方法,毕竟都与4个参数的数量不符!
结果呢?
using optional parameters
1
using optional parameters
3
using optional parameters
6
using optional parameters
10
using parameter list
15
using parameter list
21
using parameter list
28
using parameter list
36
请按任意键继续. . .
发现对于参数数小于或等于4的都选用的是带4个参数的方法,而大于4的选用的是可选参数的方法。
解析:
从表面看,获取参数数组的方法和获取可选参数的方法似乎存在着一定程度的重叠,但是,两者有着根本的不同。
1、对于获取可选参数的方法来说,它仍然有一个固定的参数列表,不能传递一组任意的实参。编译器会生成代码,在方法运行前,为任何遗漏的实参在栈上插入默认值。
方法不关心哪些实参是由调用者提供的,哪些是由编译器生成的默认值。
2、使用参数数组的方法相当于有一个完全任意的参数列表,没有任何参数具有默认值。此外,方法可准确判断调用者提供了多少个实参。
可以理解为当参数个数小于4时,参数数组的方法编译时给添加了默认值,也就是
int Param1 = 0, int Param2 = 0, int Param3 = 0, int Param4 = 0
试一试假如把 Param4 的默认值改一下,改为4,结果 :
using optional parameters
5
using optional parameters
7
using optional parameters
10
using optional parameters
10
using parameter list
15
using parameter list
21
using parameter list
28
using parameter list
36
请按任意键继续. . .
发现参数个数小于4的都发生了变化,运行时加上的都是默认值 Param = 4。
但是,假如我们把默认值去掉呢?
int Param1 , int Param2 = 0, int Param3 = 0, int Param4 = 0
int Param1 , int Param2, int Param3 = 0, int Param4 = 0
int Param1 , int Param2, int Param3 , int Param4 = 0
int Param1 , int Param2, int Param3 , int Param4
像上面一样把默认值从前往后的一个一个的去掉,试一试(如果是从后往前的去,会报错“可选参数必须出现在所有必需的参数之后”),
与之对应的结果就是:
去除 Param1 的默认值
using optional parameters
1
using optional parameters
3
using optional parameters
6
using optional parameters
10
using parameter list
15
using parameter list
21
using parameter list
28
using parameter list
36
请按任意键继续. . .
去除 Param2 的默认值
using parameter list
1
using optional parameters
3
using optional parameters
6
using optional parameters
10
using parameter list
15
using parameter list
21
using parameter list
28
using parameter list
36
请按任意键继续. . .
去除 Param3 的默认值
using parameter list
1
using parameter list
3
using optional parameters
6
using optional parameters
10
using parameter list
15
using parameter list
21
using parameter list
28
using parameter list
36
请按任意键继续. . .
去除 Param4 的默认值
using parameter list
1
using parameter list
3
using parameter list
6
using optional parameters
10
using parameter list
15
using parameter list
21
using parameter list
28
using parameter list
36
请按任意键继续. . .
可以总结成这样:当使用参数数组的方法的参数都有值时,方法才能运行,不管是输入值还是默认值(优先输入值);当使用可选数组的方法的参数只要有有效参数,方法就可运行。使用参数数组的方法更像 并集 = 全集 ,使用可选数组的方法更像 非 != 全集 。