参考书:《 visual C# 从入门到精通》
第二部分 理解C#对象模型
第11章 理解参数数组
11.1 回顾重载
重载虽然很好用,但有时还是会不那么方便,当参数数量变化时重载就很难解决了。C#提供一种技术允许只写一个方法就能接受数量可变的参数:参数数组(关键字params
声明的参数)。
11.2 使用数组参数
class Util{
public static int Min(int[] paramList){
if(paramList==null || paramList.Length==0){
throw new ArgumentException("Util.Min: not enough arguments");
}
int currentMin=paramList[0];
foreach(int i in paramList){
if(i<current){
currentMin=i;
}
}
return currentMin;
}
}
上述代码实现了求多个int 变量的最小值,但需要求几个数的最小值时需要创建额外的数组,当然也可以使用匿名数组:int min=Util.Min(new int[]{first,second,third});
。
11.2.1 声明参数数组
class Util{
public static int Min(params int[] paramList){
...;
}
}
这样的话调用方法时可以传递任意数量的参数实参。
int min =Util.Min(first,second);
编译器自动将上述调用转换成如下代码:
int[] array=new int[2];
array[0]=first;
array[1]=second;
int min=util.Min(array);
参数数组需要注意几点:
- 只能为一维数组使用
params
关键字 params
关键字不是方法签名的一部分,不能依赖它来重载方法- 不允许为参数数组指定修饰符
ref
或out
params
数组必须是方法的最后一个参数,所以每个方法只能有一个参数数组- 非
params
方法总是由于params
方法,所以还是可以创建方法的重载版本
11.2.2 使用params object[]
如果参数类型和数量都不固定,就需要object
了,编译器通过装箱将值类型转换成对象。如:
class Black{
public static void Hole(params object[] paramList){
...;
}
}
我们将这样的方法称为Black.Hole
(黑洞)。
11.2.3 使用参数数组
如我们实际使用时:
Util.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace c_11_2_3
{
class Util
{
public static int Sum(params int[] paramList)
{
if(paramList == null)
{
throw new ArgumentException("Util.Sum :null parameter List");
}
if (paramList.Length == 0)
{
throw new ArgumentException("Util.Sum: empty parameter List");
}
int sumTotal = 0;
foreach(int i in paramList)
{
sumTotal += i;
}
return sumTotal;
}
}
}
Program.cs
using Microsoft.VisualBasic.CompilerServices;
using System;
namespace c_11_2_3
{
class Program
{
static void dowork()
{
//Console.WriteLine(Util.Sum(null));
//Console.WriteLine(Util.Sum());
Console.WriteLine(Util.Sum(10, 9, 8, 7, 6, 5, 4, 3, 2, 1));
}
static void Main(string[] args)
{
try
{
dowork();
}catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
11.3 比较参数数组和可选参数
参数数组和可选参数有着根本的不同。