数组参数
区分Fun(double [] Array)的Fun(params double [] Array)区别
I 前者直接将数组类型作为参数,因此必须输入强类型数组参数才可以
后者有两种方式传入参数,第一种是将数组元素(相同类型)以逗号隔开的方式传入,第二种是直接将强类型数组为参数传入。
II 前者是按照定义类型将强类型数组作为参数直接处理
后者则是将可变数量个参数作为一个逻辑参数传给方法,当以若干个数组元素输入时,系统会在运行时,由CLR重新创建一个数组,然后将这些参数作为新的数组元素进行处理。
由于前者的优先级高于后者,因此若后者以强类型数组的方式作为参数时,后者将由系统自动转化成前者进行处理。
代码如下:
static double CalculateAverage(params double[] values)
{
Console.WriteLine("数组长度为{0} ", values.Length);
double sum = 0;
for (int i = 0; i < values.Length; i++)
// 将数组元素作加一操作,用于测试输入数组元素是否会变化
sum += values[i]++;
return (sum / values.Length);
}
static void Main(string[] args)
{
double average;
// 将数组元素作为实参
average = CalculateAverage(4.0, 3.2, 5.7, 64.22, 87.2);
Console.WriteLine("平均值: {0}", average);
// 将强类型数组作为参数
double[] data = { 4.0, 3.2, 5.7 };
average = CalculateAverage(data);
Console.WriteLine("平均值: {0}", average);
Console.WriteLine("第一个数组元素: {0}", data [0]);
}
输出结果:
数组长度为5
平均值: 32.864
数组长度为3
平均值: 4.3
第一个数组元素: 5.0
由上面运行结果可知,以强类型数组作为参数时,若系统由CLR创建一个新的数组副本,将输入强类型数组的元素作为数组副本的元素,则对数组副本的操作不会改变原有数组的数组元素而结果并非如此,而是原有的数组也随之改变,说明系统并未重新生成数组副本。
可选参数
.NET4还提供可选参数,目的是为了简化与原有COM对象的互操作。
例如:
static void EnterLogData(string message, string owner = "Programmer")
{
Console.WriteLine("Error: {0}", message);
Console.WriteLine("Owner of Error: {0}", owner);
}
static void Main(string[] args)
{
EnterLogData("Oh no! Grid can't find data");
EnterLogData("Oh no! I can't find the payroll data", "CFO");
}
若不指定参数,则使用默认的参数,分配给可选参数的值必须是编译时确定的,而不能在运行时确定,例如:
EnterLogData("Oh no! I can't find the payroll data", DateTime.Now.ToString ());
运行时会报错的,因为DateTime.Now的值只有在运行时才能确定。
可选参数必须放在参数列表的末尾,因此,不能与数组参数一起使用。
命名参数
与可选参数一样,为了与原有的COM对象交互操作,.NET4还提供了命名参数,即使用":"通过参数名来指定参数,可以不按照声明方法时的参数顺序来传参。
例如:声明Fun(int a,int b,int c)在使用时Fun(0,c:2,b:1);的形式调用,为了避免混乱C#语言规定在命名参数必须放在位置参数之后,
命名参数最大的用处就是和可选参数一起使用,假如,一个方法 有多个可选参数,若只想对其中某几个参数进行赋值,则必须指明所要赋值的参数,此时必须使用命名参数,例如:声明Fun(int a,int b=1,int c=2),其中b和c都是可选参数,若只想对c进行赋值,b只使用默认值,则可以Fun(0,c:2),这样就可以清楚的表达出参数的赋值关系。
方法重载
方法重载只与方法的参数数量和类型有关,与方法的返回值无关。