关于C#方法参数的讨论

来源:互联网 发布:2016机顶盒看电影软件 编辑:程序博客网 时间:2024/05/18 02:11

数组参数

区分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)其中bc都是可选参数,若只想对c进行赋值,b只使用默认值,则可以Fun(0,c:2),这样就可以清楚的表达出参数的赋值关系。

方法重载

方法重载只与方法的参数数量和类型有关,与方法的返回值无关