第11章 参数数组

1.数组参数与参数数组
如方法需要获取数量可变、类型也可能不同的实参,就可以考虑使用参数数组。

// 使用数组参数
public int AddArray(int [] paramList)
{
    if(paramList == null || paramList.Length == 0)
    {
        throw new ArgumentException("AddArray: not enough argument");
    }
    
    int sum = 0;
    foreach(var i in paramList)
    {
        sum+=i;
    }
    return sum;
}

// 使用参数数组
public int AddParams(params int [] paramList)
{
    if(paramList == null || paramList.Length == 0)
    {
        throw new ArgumentException("AddParams: not enough argument");
    }
    
    int sum = 0;
    foreach(var i in paramList)
    {
        sum+=i;
    }
    return sum;
}

// 数组参数调用
int [] numbers = {2,3,4,5,6};
int sumArray = AddArray(numbers);

//参数数组调用
int sumParam = AddParam(2,3,2,1,4,6,5,6,7,8,7); // 参数数组允许将数量可变的实参传给方法。

2.参数数组注意事项
a:只能为一维数组使用params关键字,不能用于多维数组。
//编译错误
public static int Min(params int[,] paramList)
{
    ......
}


b: 不能只依赖params关键字来冲载方法。params关键字不是方法签名的一部分。方法签名:方法名称,参数数量和参数类型。返回类型不计入方法签名。
// 编译错误
public int Add(params int [] paramList)
{
    ......
}

public int Add(int [] paramList)
{
    ......
}

c: 不允许为参数指定ref或out修饰符。
// 编译错误
public int Max(ref params int [] paramList)
{
    ......
}

public int Max(out params int [] paramList)
{
    ......
}

d: 非params方法总是优先于params方法。重载情况下,非params方法优先级更高。


3.使用params object [] object是所有类的根,编译器通过装箱将值类型转换成对象。可以让方法接收object类型的一个参数数组,从而接收任意数量的实参; 换言之,实参不仅数量随意,类型也可以随意。
public void BlackHole(params object [] paramList)
{
    ......
}

// 不向它传递任何实参,编译器将传递长度为0的object数组。
BlackHole(); // BlackHole(new object[0]);

// 传递null作为实参。数组是引用类型,所以允许使用null来初始化数组。
BlackHole(null);

BlackHole("Fanda", 999.88,23); // BlackHole(new object[]{"Fanda", 999.88, 23});

Console.WriteLine重载方法

public static void WriteLine(string format, params object[] arg);

Console.WriteLine("Name: {0}, Age: {1}, Address: {2}", name, age, address);
编译器会将此调用解析成以下形式:
Console.WriteLine("Name: {0}, Age: {1}, Address: {2}", new object[]{name, age, address});
posted @ 2021-02-20 14:29  葡式蛋挞  阅读(18)  评论(0)    收藏  举报