【唐老狮】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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
2014-08-10 伯恩斯情绪疗法