传值参数(值参数)
1 什么是传值参数
·声明时不带修饰符的形参是值形参。一个值形参对应于一个局部变量,只是它的初始值来自该方法调用所提供的相应实参。(传值参数为传进来的实参创建副本,即创建新的存储位置)
2 两种类型的传值参数
值类型的传值参数
引用类型的传值参数
·引用类型的变量存储的是地址
·引用类型的传值参数,并且创建新的对象
·调用GetHushCode方法,得到的是用来代表对象的唯一值,每个对象的HushCode都不一样
·引用类型的传值参数,只操作对象,不创建新对象
输出参数
1 什么是输出参数
·用out修饰符声明的形参是输出形参。类似于引用形参,输出形参不创建新的存储位置。相反,输出形参表示的存储位置恰是在该方法调用中作为实参给出的那个变量所表示的存储位置。变量在可以作为输出形参传递之前不一定需要明确赋值,但是在方法返回之前,该方法的每个输出形参都必须明确赋值。
2 两种类型的输出参数
值类型的输出参数
·输出参数并不创建变量的副本
·方法体内必须要有对输出变量的赋值的操作
·使用out修饰符显式指出——此方法的副作用是通过参数向外输出值
·从语义上来讲——ref是为了“改变”,out是为了“输出”
·调用带有输出参数的方法
·声明带有输出参数的方法
引用类型的输出参数
引用参数
1 什么是引用参数
·引用形参是用ref修饰符声明的形参。与值形参不同,引用形参并不创建新的存储位置。相反,引用形参表示的存储位置恰是在方法调用中作为实参给出的那个变量所表示的存储位置。(引用参数直接指向传进来的实际参数所指向的内存地址)
2 两种类型的引用参数
值类型的变量以引用参数的形式传进方法
·使用ref修饰符显式指出——此方法的副作用是改变实际参数的值
引用类型的引用参数,并且创建新的对象
引用类型的引用参数,不创建新对象只改变对象值
·此时与传值参数在效果上并无不同,但是内存机理不一样(如果把outterStu前面的ref修饰符去掉,得到的结果仍然是下面的结果)
总结
·引用类型的传值参数,不创建新对象只改变对象值:stu参数和outterStu变量两个所指向的内存地址是不同的,但是不一样的两个内存地址里存储着一个相同的地址,这个地址就是实例在堆内存中的地址。
·引用类型的引用参数,不创建新对象只改变对象值:stu参数和outterStu变量两个所指向的内存地址就是同一个内存地址,而这个内存地址里所存储的就是对象在堆内存中的地址。
数组参数
·参数列表中只能有一个数组参数,而且必须是形参列表中的最后一个,由params修饰
不使用params修饰符修饰需要自己声明一个数组
使用params修饰符修饰编译器自动声明数组
·举例:String.Format方法和String.Split方法(参数为数组参数的方法)
具名参数
·参数的位置不再受约束
不具名调用与具名调用
可选参数
·参数因为具有默认值而变得“可选”(对于带有默认值的参数,调用方法时不写这个参数,这个参数自动获得声明时的默认值)
·不推荐使用可选参数
扩展方法(this参数)
1 什么是扩展方法?
·方法必须是公有、静态的,即被public static所修饰的
·必须是形参列表中的第一个,由this修饰
·必须由一个静态类(一般类名为SomeTypeExtension)来统一收纳对SomeType类型的扩展方法
2 对比例子
·不使用扩展方法
·使用扩展方法
3 举例:LINQ方法
·LINQ方法非常多,这只是其中之一
·不使用LINQ方法
·使用LINQ方法
各种参数的使用场景总结
·传值参数:参数的默认传递方式
·输出参数:用于除返回值外还需要输出的场景
·引用参数:用于需要修改实际参数值的场景
·数组参数:用于简化方法的调用
·具名参数:提高可读性
·可选参数:参数拥有默认值
·扩展方法(this参数):为目标数据类型“追加”方法