c# ref和out 详解
前言
数据在内存中,存在两种状态,堆和栈中。堆中的数据是可以直接拿到的,一般称引用对象。
这些对象有一个特征,那就是经过函数处理之后,这些数据在主线程中改变了。好奇点好了,为什么栈中的数据就不会改变呢?难道是没有计算?
其实计算机哪有这么聪明,不过是找了个替代者----形参。可以说就像古代上战场抓壮丁一样,总有些替代者,战场无论生死和原来没有去的那个人没有任何关系。
这就形成了一种特殊情况了,那么特殊情况下就拥有局限性,所以出现了ref和out。
正文
ref和out到底是啥?有什么区别。
区别:ref是传的的是地址。是地址那么就有地标和名称,比如说经度纬度定位到某个地方。
所以有一个规定就是ref必须赋值然后才能调用,为什么会有这个规定呢,或者说是不是必须有这个规定呢。
是的,必须的,很简单,如果一个地址没有对应到栈中的参数,它在赋值的时候就需要往堆中分配一个,而函数其实就是一个对象,会分配相应的堆区,这些区是会被释放的,所以任何修改没有任何意义。
out 是啥?out是这样的。就像一个门外汉,在外面等,等给他东西。为何out不能传值?假设out传递了值,那么他是这样的,在函数中创建了一个形参,并分配了一个栈,可以说是一个新的对象。这时候好像回到了原点。那么这个out是这样做的,out的确是分配了函数的栈,但是它不释放。
优点:两者都可以让传入函数的值类型得到改变。缺点:性能肯定是下降了。
对于string的优化
string有一种方式,叫做stringbuild,这个关键字是引用类型,可以解决一下string的问题,性能比ref和out好点。