c# ref和out 详解

前言

数据在内存中,存在两种状态,堆和栈中。堆中的数据是可以直接拿到的,一般称引用对象。

这些对象有一个特征,那就是经过函数处理之后,这些数据在主线程中改变了。好奇点好了,为什么栈中的数据就不会改变呢?难道是没有计算?

其实计算机哪有这么聪明,不过是找了个替代者----形参。可以说就像古代上战场抓壮丁一样,总有些替代者,战场无论生死和原来没有去的那个人没有任何关系。

这就形成了一种特殊情况了,那么特殊情况下就拥有局限性,所以出现了ref和out。

正文

ref和out到底是啥?有什么区别。

区别:ref是传的的是地址。是地址那么就有地标和名称,比如说经度纬度定位到某个地方。

所以有一个规定就是ref必须赋值然后才能调用,为什么会有这个规定呢,或者说是不是必须有这个规定呢。

是的,必须的,很简单,如果一个地址没有对应到栈中的参数,它在赋值的时候就需要往堆中分配一个,而函数其实就是一个对象,会分配相应的堆区,这些区是会被释放的,所以任何修改没有任何意义。

out 是啥?out是这样的。就像一个门外汉,在外面等,等给他东西。为何out不能传值?假设out传递了值,那么他是这样的,在函数中创建了一个形参,并分配了一个栈,可以说是一个新的对象。这时候好像回到了原点。那么这个out是这样做的,out的确是分配了函数的栈,但是它不释放。

优点:两者都可以让传入函数的值类型得到改变。缺点:性能肯定是下降了。

对于string的优化

string有一种方式,叫做stringbuild,这个关键字是引用类型,可以解决一下string的问题,性能比ref和out好点。

posted @   敖毛毛  阅读(1688)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示