【唐老狮】C#——ref和out
上篇文章我们学习了函数的基础知识,今天要学习的ref和out就是需要和函数配合使用的知识点,而且是初级面试中最容易被问到的知识点。
【ref和out】
【为什么要使用ref和out】
如果我们想要通过函数改变一个值类型变量的值,这样写是没有办法改变的。因为我们知道值类型在进行值传递时,是在栈空间中重新开辟了空间,将内容拷贝到新空间。
这就是使用ref和out的原因,他们的作用是一样的,可以按地址传递对象,在函数内部改变后将改变原来参数的值。
【ref】
函数参数的修饰符
当传入的值类型参数在内部修改时
外部的值会发生变化
外部的a变成了3
【out】
函数参数的修饰符
当传入的值类型参数在内部修改时
外部的值会发生变化
外部的a变成了3
【ref和out的区别】
通过上面的两段代码,你肯定会一脸懵,看起来ref和out一模一样,都是参数前面的修饰符,都是传递引用地址可以在内部改变后,外部也变。那它们有什么区别呢?
区别一
ref传入的变量必须初始化
out不用
区别二
out传入的参数必须在内部赋值
ref不用
【ref和out对引用类型同样有效】
很多人可能会觉得这时候因为引用类型赋值时是传递的地址,那这时候第一个元素应该是3才对啊。我们来画图分析一下!
也就是,引用类型的数组new了一个新数组,就意味着在堆内存中重新开辟了内存空间,当前变量指向的地址也会随之改变。所以当改变了array后并没有影响到外部的arr数组。
加上ref或者out
我们从打印结果中明显的看到,外部的arr被修改了,所以我们说ref和out对于引用类型的对象来说,也是管用的!我们来图解一下!
【总结】
ref和out
相同点
函数参数的修饰符
传递对象的引用地址
让参数在函数内部修改后
外部也改变
不同点
◇初始化不同
ref必须初始化
out可以不初始化
◇内部赋值不同
ref可以不在内部赋值
out必须在内部赋值
注意
值类型和引用类型
都受影响
关注唐老狮获取更多干货内容
转 https://zhuanlan.zhihu.com/p/463771455