9.4 向方法传递可变数量的参数
为了接受可变数量的参数,方法要像下面这样声明
static Int32 Add(params Int32[] values) { Int32 sum=0; if(values!=null) { for(Int32 x=0;x<values.Length;x++) sum+=values[x]; } return sum; }
params只能应用于方法签名中的最后一个参数。
可以向下面这样调用该方法。
Console.WriteLine(Add(new Int32[]{1,2,3,4,5}));
数组能用任意数量的一组元素来初始化,再传给Add进行处理。
由于params关键字的存在,我们可以这样调用Add方法。
Console.WriteLine(Add(1,2,3,4,5));
params关键字告诉编译器像参数应用定制特性System.ParamArrayAttribute的一个实例。
编译器如何处理params关键字
C#编译器检测到该方法时,检查所有具有指定名称,同时参数没有应用Params特性的方法。
占到匹配的方法后生成调用它所需的代码。没有找到就接着检查。
找到匹配方法,编译器生成代码构造一个数组,填充元素,再生成代码来调用所选方法。
params关键字使用要求
只有方法的最后一个参数才可以用params关键字。
这个参数只能标识一维数组,任意类型。
可为这个参数传递null,或者传递包含零个元素的一个数组的引用。
以下Add调用能正常编译和运行,控制台显示的都是0.
Add(); Add((null));
写方法获取任意数量任意类型的参数
只需修改方法原型,让他获取一个Object[]。
static void DisplayTypes(params Object[] object) { if(object!=null) { foreach(Object o in object) Console.WriteLine(o.GetType()); } }
调用该方法
DisplayTypes(new Object(),new Random(),"Jeff",5);
上述代码输出
System.Object
System.Random
System.String
System.Int32
重要提示
调用参数数量可变的方法对性能有所影响,除非显式传递null。
毕竟数组对象必须在堆上分配。数组元素必须初始化,而且数组的内存最终需要垃圾回收。
定义几个没有使用params关键字的重载版本可以减少对性能的影响。
这方面的范例可以参考System.String类的Concat类。
使用params关键字的重载用于不太常见的情形。