值参数指的是参数类型,不是指数据类型(值类型,引用类型)。不要混淆!
值类型:结构体、枚举类型。引用类型:类、接口、委托。
值参数是一个变量,它有值类型和引用类型两种。
引用参数是一个变量,它也有值类型和引用类型两种。

值参数

image.png
声明时不带任何修饰符号的形参是值参数。相当于一个局部变量,是实参的一个副本。
当我们对方法体内的值参数进行赋值的时候不会影响到实参的值(这个值要么是值类型,要么是一个引用类型地址,这里不会改变指的是这个地址,地址才是引用参数的值)。
image.png
引用类型的值参数,当参数在函数内部被赋值新的对象时,实参的地址不会改变(地址不变),所以引用的对象不变。
image.png
只操作对象不赋值新对象时,此时,修改函数内部的参数,相当于修改实参所引用的对象数据。
image.png

引用参数

image.png
实参和形参的声明所指向的是同一个地址(注意,这里说的地址是声明的地址,不是存储的值)。此时,实参和形参是同一个变量,没有人各不同。
image.png
image.png
这里看起来和传值参数的不替换对象效果相同,实际原理不同。
传值参数不替换对象:实参和形参声明时开辟的内存地址不同,是不同的两个变量,只是他们的值(存储的那个地址指向的是同一个对象),所以修改任意一个,都是修改这个对象。两个小孩牵着同一个气球。
下图原理:实参和形参时完全相同的变量,内存空间是同一块,在不修改存储的内存值的情况下,他俩指向的就是同一个对象。一个小孩两只手,牵着一个气球。
PS:查看一个对象或者变量是否是同一个,可以查看哈希值。
image.png

输出参数

引用参数是为了修改地址指向的那个参数,所以ref 使用时,参数需要有明确的赋值。
输出参数out ,为了返回一个值给参数,所以out的参数不需要有明确的赋值。
相当于利用传递进来的参数没有存储地址值,我们利用out的作用,将地址值赋值给参数,这样实参也会被赋值。
image.png
image.png
使用输出参数,能在不占用返回值的情况下,修改参数。
image.png
image.png

数组参数

image.png
加了params 传递数组时,不需要额外的创建数组对象,直接传递一串参数既可。
image.png

扩展方法

image.png
这里的this 指的是,谁使用它,他就是谁。所以Round方法现在只需要一个参数,因为第一个参数已经用this指向了x。
当我们无法修改源码时,我们可以使用扩展方法为这种目标数据类型追加方法。
image.png