zoukankan      html  css  js  c++  java
  • c# ref和out 详解

    前言

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

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

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

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

    正文

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

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

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

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

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

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

    对于string的优化

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

  • 相关阅读:
    Scala: 包对象
    云服务使用技巧
    leetcode上一些常见的链表问题
    数据挖掘的价值
    leetcode上的一些分治算法
    双指针的应用
    KNN算法
    线性回归
    leetcode上的一些单链表
    leetcode上的一些栈、队列问题
  • 原文地址:https://www.cnblogs.com/aoximin/p/13130507.html
Copyright © 2011-2022 走看看