- [摘要]:
传值参数(值传递 )方法中的[参数]会为传进来的 [变量] 创建一个副本,而在引用传递中,不会创建一个副本,方法中的 [参数] 是直接指向 [变量] 。
在方法中,如果使用new操作符生成了一个新对象。引用传递的结果是对方法之外的 [变量] 产生影响,将[变量]指向更改为新对象。但值传递的结果是不会对方法之外的 [变量] 的数据产生影响。
一、刘铁猛《C#语言入门详解》全集-P18节,方法(Method) 的值传递 和 ref引用传递 背后的内存机理的理解。
- 1、值传递 -> 传入一个引用类型参数
- 2、引用传递 -> 传入一个引用类型参数
- 3、理解1+2 的区别:
传值参数(值传递 )方法中的[参数]会为传进来的 [变量] 创建一个副本,而在引用传递中,不会创建一个副本,方法中的 [参数] 是直接指向 [变量] 。
在方法中,如果使用new操作符生成了一个新对象。引用传递的结果是对方法之外的 [变量] 产生影响,将[变量]指向更改为新对象。但值传递的结果是不会对方法之外的 [变量] 的数据产生影响。
二、各种参数的使用示例
-
1、值传递-情况1:
-
2、值传递-情况2:
传值函数(值传递一个对象实例),在内存中创建了实际参数的副本,怎么理解这句话?下图中,赋值前,方法中的[参数]创建了一个实际[变量]的副本。如如果你在方法中,对参数 使用操作符new 创建了一个新对象,并对这个新对象做出一些更改,那么这个new操作不会影响 方法之外的 [变量]所指的对象数据。这就是创建了副本的意义。
下面这种传值方式,在工作中,很少见。
下图中,赋值后,通过传进来的[参数]修改对象的成员状态,在方法结束后,再通过[变量]访问对象,该对象成员状态已经被上面的方法修改过了。 -
3、引用传递-情况1:
-
4、引用类型-情况2:
4.1、常用情形:
4.2、不常用情形: -
5、输出参数-情况1:
5.1、out-传入值类型示例:
double.TryParse()方法的实现,同样的,需要知道的是,在转换类型失败,double.TryParse()也会将传入的参数值更改成0。 -
6、输出参数-情况2:
- 7、数组参数:
示例1:不用params关键字修饰
示例2:用params关键字修饰,使用方便、简洁。
示例3:使用params的其他方法