C#的六种参数形式介绍

发布时间 2023-06-06 09:50:28作者: [春风十里]

平时在工作学习过程中,编写或调用函数时会遇到各种形式的参数,网络查询后特记录后用(参考他人总结):

共六种形式:值参数、引用参数、输出参数、参数数组、命名参数、可选参数;

------------------------------------------------------值参数--------------------------------------------------------------

最常用的参数形式;

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参数,必须在所有可选参数之后声明。

必须从可选参数列表的最后开始省略,一直到开头,否则会造成参数歧义。

若想消除参数歧义,可以结合命名参数和可选参数的特性。