c#有值类型和引用类型之分,在传递参数时,引用类型传的是引用,值类型传的是值本身,但有时候我们需要把值类型当成引用类型进行传递。
案例:
首先我们定义一个用户类:
再定义一个测试类,用来修改用户的年龄,有四个方法,第一个是传用户对象,第二个是传值类型本身,第三和第四个是传值类型的引用:
在Test方法中我们对这四个方法进行测试,看看哪些值被修改后会影响原来的对象:
方法一是直接传递对象引用,所有对该对象的变更都会影响原来的实例,这是引用类型的特性在使用时需要多注意;
方法二传递的是值类型属性,传递的是值本身所以被修改后不会影响原来的实例;
方法三和四是本章的重点,我们虽然传递的是值类型,由于使用了ref、out关键词,这时传递的是参数的内存地址而不是值本身,所以被修改的值会影响原来的变量值。
我们来看输出结果:
不管是ref,还是out 都是传递变量的内存地址。为什么需要ref 和out 不是只要一个就能实现传递引用了吗,细心的同学已经发现了,在使用ref时变量必须初始化:
而使用out时变量不需要初始化但在函数中需要赋值:
C#就是这么强大,明明是值类型却可以当成引用进行传递,太棒了。