CLR via C#学习笔记-第九章-向方法传递可变数量的参数

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关键字的重载用于不太常见的情形。

原文地址:https://www.cnblogs.com/errornull/p/9832601.html