【唐老狮】C#——ref和out

发布时间 2023-08-10 15:21:14作者: dreamw

上篇文章我们学习了函数的基础知识,今天要学习的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