C#的六种参数形式介绍
平时在工作学习过程中,编写或调用函数时会遇到各种形式的参数,网络查询后特记录后用(参考他人总结):
共六种形式:值参数、引用参数、输出参数、参数数组、命名参数、可选参数;
------------------------------------------------------值参数--------------------------------------------------------------
最常用的参数形式;
void DoWork(int para1, string para2, bool para3, float para4)
注意值参数,并不是指参数类型是值类型,指的是调用参数时,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作;
1、在栈中为形参分配空间。
2、复制实参到形参。
例如参数para=5是int类型,则把para的值5传递给方法;此时在方法中更改形参的值并不影响实参。
例如para是引用类型,则传递过去的是para指向的堆中的对象。此时形参和实参指向同一个对象,修改形参中的值,则实参的值同时发生改变。
-----------------------------------------------------引用参数--------------------------------------------------------------
*注意不是引用类型的参数
1、使用引用参数时,必须在方法的声明与调用中使用ref修饰符。
2、实参调用前必须赋值。
引用参数等于把实参的地址传递给方法,方法中的任何操作都会更改实参的值。
*引用类型的参数在加ref和不加的区别是(ref指向新地址则实参跟随改变指向)(不加ref指向新地址与实参无关)
void DoWork(ref int para)
-----------------------------------------------------输出参数--------------------------------------------------------------
方法结束前必须对形参进行赋值;
1.调用时使用out修饰符;
2.实参在调用前没必要赋值;
输出参数也是等于把实参的地址传递给方法,与引用参数的区别是方法结束前必须对参数进行赋值,所以调用前的赋值会被覆盖,没必要赋值。
void DoWork(out int para) { para = 1; }
-----------------------------------------------------参数数组--------------------------------------------------------------
比如有一个方法要求和,可以传入1个整数参数,也可以2个,也可以3个,依次类推多个,此时显然不能重复写n个方法以支持多种情况。此时用到参数数组
void DoWork(params int[] para)
此时调用DoWork方法可以传入大于等于1个数量的整数类型参数;必须要有params修饰符(调用不需要修饰符),必须是一种类型的数组。
1、在一个参数列表中只能有一个参数数组。
2、如果有,它必须是列表中的最后一个。
-----------------------------------------------------命名参数--------------------------------------------------------------
在给方法传入参数时标明形参名称;
在调用方法时,必须严格按照形参的顺序写入参数,命名参数允许你任意顺序写入参数,需要在参数前加上形参名称:
void DoWork(int para1, int para2, int para3)
Z如果想传入1,2,3,以前只能写DoWork(1,2,3),命名参数可以写成:
DoWork(para3:3,para1:1,para2:2);
----------------------------------------------------可选参数--------------------------------------------------------------
在方法调用时可以传入某参数,也可以不传,需要为参数指定默认值;
void DoWork(int para1, int para2 = 2, int para3 = 3)
调用可用以下形式:
DoWork(1);//等于1,2,3 DoWork(1, para3: 13);//等于1,2,13
不是所有的参数类型都可以作为可选参数。
1、只要值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数。
2、只有在默认值是null的时候,引用类型才可以作为可选参数来使用。
3、可选参数只能是值参数。
所有必填参数必须在可选参数声明之前声明,如果有params参数,必须在所有可选参数之后声明。
必须从可选参数列表的最后开始省略,一直到开头,否则会造成参数歧义。
若想消除参数歧义,可以结合命名参数和可选参数的特性。