C#默认参数,可变参数

        static void Main()
{
Console.WriteLine(test(1));//第一个参数是我们传递的,第二个参数使用默认的
Console.WriteLine(test(2,"operators"));//两个参数都是我们自己定义的了
Console.WriteLine(Params("qq"));//第二个参数传递的是 new int[0];
Console.WriteLine(Params("qq", null));//与上面的是同样的效果,但是这样更高效,因为不会分配数组;
Console.WriteLine(Params("qq",1,2,3,4));
Console.WriteLine(Params("tt", 1, 2));//先检查所有具有指定名称,同时参数没有应用paramArry attribute的方法,如果找到匹配的方法,就生成对这个方法的调用。
//如果没有找到,就会接着检查应用了ParamArry attribute的方法。
Console.WriteLine(Params("nn", 1, 2, 4, 5, 6));//这个调用static string Params(string s,int i=1,params int[] obj)方法,先去匹配非可选参数的方法的参数。
Console.ReadKey();
}
static string test(int i,string s = "default")//可选参数必须出现在所有必需参数后面
{
return s;
}
static string Params(string s,params int[] i)//可变量参数必须是形参列表中的最后一个参数
{
if (i != null)
{
for (int t=0; t < i.Length; t++)
{
s +=i[t].ToString();
}
}
return s;
}
static string Params(string s,int i=1,params int[] obj)//但是,缺省参数后面可以跟数组参数(params参数),
//实际上无论在什么情况下,params参数都只能是最后一个声明的参数。缺省参数的另一个限制是:指定的缺省值必须是一个常量。
{
foreach (object o in obj)
{
s += o.ToString();
}
return s;
}
static string Params(string s, int i, int t)
{
return s+i.ToString()+t.ToString();
}

}

使用默认参数时,如果对参数用ref或者out关键字进行了标识,就不能设置默认值,因为没有办法为这些参数传递一个有意义的默认值。

调用一个参数数量可变的方法时,会造成一些额外的性能上的损失(除非显式传递null),毕竟数组对象必须在堆上分配,数组元素必须初始化,而且数组的内存最终必须垃圾回收,为了降低性能损失,可以考虑定义几个没有使用params关键字的重载版本。
编辑器加载中...

原文地址:https://www.cnblogs.com/smailxiaobai/p/2279373.html