params表示参数是可变个数的
在不加params修饰时,只能往里传入一个数组。
在加了params后,不仅可以传入数组,还可以传入多个参数,这多个参数等价为数组。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
C++中允许函数带有默认参数,允许不定数目的参数。但C#中不允许函数参数带有默认值。默认值这种功能,只能用函数重载来代替实现了。
但是C#允许方法带有不定数量的参数。使用params关键字,且参数必须是参数表中的最后一个参数。
要点:
1params不能用在多维数组上,这个大家可以试试,肯定会报错的。错误提示参数数组必须为一维数组
2.不能使用params来重载方法
3.不允许ref和out 与 params同时使用,加上之后程序编译时报错。因为数组的传递的本来就是引用(只限于用数组的方式进行调用),用上面调用方式2则无法对实参进行更改。用调用方式1时,在函数内部对参数数组的值进行了更改,则作为实参的数组的值也被更改。
4.params数组必须是最后一个参数。
5.一个没有params的方法的优先级高于带有params的方法
6.可以不传入任何参数
System.Object(object)是所有类的根,使用params object数组来声明一个方法,它能接受任意数量的object参数;换言之,不仅参数的数量是任意的,参数的类型也可以是任意的。所以,此方法称为Black.Hole(黑洞)
1. 可以不向它传递任何参数
2. 可以在调用它时,传递null作为参数
3. 可以向它传递一个实际的数组。也就是说,可以人工创建本由编译器来创建的数组
4. 可以向它传递不同类型的其他任何参数,这些参数将自动封装到一个object数组
using System;
class Program
{
static void Main()
{
fun("Call 1");
Console.WriteLine("\n");
fun("Call 2", 2);
Console.WriteLine("\n");
fun("Call 3", 3.2, "hey look at here", false);
Console.ReadLine();
}
static void fun(string str, params object[] args)
{
Console.WriteLine(str);
foreach (object ob in args)
{
if (ob is int)
{
Console.Write(" int : " + ob);
}
else if (ob is double)
{
Console.Write(" double : " + ob);
}
else if (ob is string)
{
Console.Write(" string : " + ob);
}
else
{
Console.Write(" other type : " + ob);
}
}
}
}
using System;
public class MyClass
{
public static void UseParams(params int[] list)
{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
static void Main()
{
UseParams(1, 2, 3);
UseParams2(1, 'a', "test");
// An array of objects can also be passed, as long as
// the array type matches the method being called.
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}