1. 值参数
通过将实参的值复制到形参的方式把数据传递给方法,在栈中为形参分配空间。
- 值类型参数会被复制,产生一个独立的数据项;
- 引用类型会复制引用,实参和形参都引用堆中同一个对象;
- 引用类型值参数,如果在方法内创建一个新对象并赋值给形参,将切断形参与实参的联系,在方法结束后,新对象也将不存在,实参仍指向原始对象。
2. 引用参数(ref)
方法的声明和调用中都要用ref修饰,实参必须是变量,传参前必须被赋值。
不会新分配内存,形参实参都指向相同的内存,方法内对参数的改变在方法外依然有效。
- 引用类型引用参数,修改会同时影响实参和形参,如果在方法内创建一个新对象并赋值给形参,形参和实参的引用都指向新对象,在方法结束后,新对象依然存在,并且是实参所引用的值,实参指向方法内创建的新对象。
3. 输出参数(out)
方法的声明和调用中都要用out修饰,实参必须是变量,传参前可以不赋值,方法内必须进行赋值。
不会新分配内存,形参实参都指向相同的内存,方法内对参数的改变在方法外依然有效。(与ref类似)
4. 数组参数(params)
在声明中数据类型前使用params修饰,可以有0个或多个实参对应一个特殊的形参(看起来像是一个数组)。
- 方法的参数列表中只能有一个参数数组,且必须在列表的最后一个;
- 参数数组的所有参数必须是相同类型;
- 方法调用时不需要params修饰符,使用逗号分隔参数;
- 参数数组如果是引用参数或输出参数,声明和调用都需要加修饰符;
- 如果数组参数是值类型,形参改变不会影响实参;
- 如果数组参数是引用类型,形参改变会影响实参。
5. 命名参数
普通情况用到的参数是未知参数,实参的位置必须与相应的形参位置对应。
命名参数,只要显示指定参数的名字,可以以任意顺序在方法中调用实参。
6. 可选参数
可选参数是在方法声明中提供默认值,在调用方法的时候可以赋值,也可以忽略。
- 只要值类型的默认值在编译的时候确定,就可以作为可选参数;
- 只有引用类型的默认值为null的时候,才能作为可选参数;
- 所有的可选参数必须在必选参数之后;
- 如果有params数组参数,必须在可选参数之后;
- 多个可选参数在省略赋值时,必须从后往前省略。