暗黑血统1剑技:大家谈谈创建和使用不定数目参数的函数
象 C 和 C++ 这样的语言提供了很多手段用于创建和使用一个接受不定数目参数的函数,最典型的例子就是 printf()函数:
int printf(char *format, …); //省略号表示参数数目不定
使用这个函数十分的简单:
printf(“Hello, world\n“);
printf(“The sum of %d and %d is %d\n“, a, b, a+b);
不过,使用这些语言创建这样的函数必须依赖于一系列预先定义的宏,而且往往并不具有直观性和优雅性。
通过运用参数数组,C#提供了一种解决这个问题的优雅的解决方案。参数数组是一个一维数组,它作为方法的最后一个参数出现在参数列表中:
public string Concat(string separator, params string[] strings)
{
string result = ““;
for (int i = 0; i 〈 strings.Length; i++)
{
if (i 〉 0)
result += separator;
result += strings[i];
}
return result;
}
上面的方法用于将一些字符串连接成一个字符串,这个方法可以以下面两种不同的方式调用:
1) 使用数组实例作为参数传递给方法:
string[] names = { “Anders“, “Eric“, “Scott“, “Duncan“ };
MessageBox.Show(Concat(“+“, names) + “ = great team“);
2)使用0个或多个类型相容的参数传递给方法:
MessageBox.Show(Concat(“+“, “Anders“, “Eric“, “Scott“, “Duncan“) + “ = great team“);
使用第二种方法调用方法时,会先使用这些类型相容的参数(上例中指的是第一个参数后面所有的参数)创建一个数组,然后把这个参数数组作为真正的实参传递给方法。从这一点可以看出:事实上,上面两种方法传递实参的机制完全相同,只是表现手法不同而已。
得益于.NET统一的类型系统(所有类型都从object继承,因此可以利用多态性原理实现类型的统一处理),定义方法时可以将object[]作为任何类型的代名称定义为参数数组,调用方法时使用具体的类型调用:
public int SumTheIntegers(params object[] list)
{
// sum all the integers included in list
int sum = 0;
foreach (object o in list)
if (o.GetType() == typeof(int))
sum += (int) o;
return sum;
}