params表示参数是可变个数的,示例如下。
在不加params修饰时,只能往里传入一个数组。调用方式1
在加了params后,不仅可以传入数组,还可以传入多个参数,这多个参数等价为数组。如调用方式2
static void Main(string[] args)
{
int[] array = new int[] { 4, 2, 3, 4, 5, 5 };
int min = Util.Min(array);//调用方式1
Console.WriteLine(min);
min = Util.Min(6, 3, 4, 5);//调用方式2
Console.WriteLine(min);
}
class Util
{
public static int Min(params int []par)
{
if (par == null || par.Length == 0)
{
throw new ArgumentException("Util.Min:Not enough arguments");
}
int min = par[0];
foreach (int i in par)
{
if (i < min)
min = i;
}
return min
}
}
注意事项:
要点1:
1params不能用在多维数组上,这个大家可以试试,肯定会报错的。错误提示参数数组必须为一维数组
2.不能使用params来重载方法
public static int Min(params int []par)
public static int Min(int []par)
这种方式是不对的,因为重载是通过参数个数不同或者相同位置参数类型不同来区分的,这两种函数,函数的参数个数和参数类型都相同,所以不能区分。
3.不允许ref和out 与 params同时使用,加上之后程序编译时报错。因为数组的传递的本来就是引用(只限于用数组的方式进行调用),用上面调用方式2则无法对实参进行更改。用调用方式1时,在函数内部对参数数组的值进行了更改,则作为实参的数组的值也被更改。
要点2:
1.params数组必须是最后一个参数。
public static int Min( int a, params int []par)
2.一个没有params的方法的优先级高于带有params的方法
public static int Min(int a,int b);//函数1
public static int Min(params int []par);//函数2
int min = Util.Min(9,2);//函数1优先级高,调用函数1,如果给a和b初始化值,则
int min = Util.Min(1, 2, 3);//函数要放两个参数,所以调用函数2
int min = Util.Min(1 );//函数要放两个参数,所以调用函数2
如果将函数1的参数进行了初始化,则
int min = Util.Min(1 );//函数1最多放2个参数,所以优先调用函数1
书上还有一条,是对于引起歧义的方法,重载编译器报错,就像下面两个一样,说优先级是一样的,所以编译器无法判断调用什么。
public static int Min(int a, params int[] par);//函数1
public static int Min(params int []par);//函数2
但是我在运行之后发现
int min = Util.Min(array);//这种情况调用函数2
int min = Util.Min();//参数为空调用函数2
int min = Util.Min(2,array);//调用函数1
int min = Util.Min(2);//调用函数1,只有一个参数,应该是,2为int,把空给那个params数组。就像参数为空时可以调用函数2 那样
int min = Util.Min(2,3);//多个参数,也是调用函数1
使用params数组:
public static void Min(params object[] par);
int[] array = new int[] { 4, 2, 3, 4, 5, 5 };
int a = 8;
object[] o = new object[] { "abc", 4.5 };
Util.Fun(a,"agga",425,5.67,array,o);//可以传递任意类型的参数,此时数组o传递到函数内,被一个引用指向o,输出的是这个对象的名字
Util.Fun(o);//可以传递object数组,此时o在函数内被引用数组指向,输出的是内容
Util.Fun();//可以什么都不传递,此时什么都没有,什么都不输出
Util.Fun(null);//也可以传递空值