当前位置 博文首页 > felicitia的专栏:.NET中的值传递与引用传递

    felicitia的专栏:.NET中的值传递与引用传递

    作者:[db:作者] 时间:2021-07-19 22:38

    今天被值传递、引用传递、值类型和引用类型搞晕了。。搜索到下面两篇信息总算是清楚了许多~大笑

    简单说来,值传递传递的时候拷贝,就算传递的是引用类型,依然是地址的拷贝,所以之前的地址不变,交换之类的不会成功,但若改变变量的值,则那个地址存的东西改变了,是会改变成功的。

    -------------------------------------------------------------------------------------------------------------------

    值类型:

    按值传递:对参数及其成员(如果有)的赋值不能反映到调用者
    按引用传递(ref/out):对参数的赋值将反映到调用者

    引用类型:
    按值传递:对参数的赋值不能反映到调用者,但是给其成员(如果有)赋值并反映到调用者

    按引用传递(ref/out):对参数的赋值将反映到调用者

    -------------------------------------------------------------------------------------------------------------------

    ? ? ? ? 值传递(不带ref或者out的):顾名思义,传递的是值,该传递会将值复制一个传递个形参。
    引用传递(带ref或者out的):同样,传递的是引用,在C和C++中叫做指针,其实就是地址,该传递不会复制一个值,只是把自己的地址传递给形参。
    ? ? ? ? 二者的区别是值传递参数的值不会被带回,而引用传递参数的值会改变。
    这样说可能会有一个问题,就是当我传递一个引用类型的参数的时候值也将被带回,这就不对了呀!
    其实不然,之所以出现这种情况是因为引用类型的变量自己本身就是一个引用,因此在传递的时候传的就是一个引用,即地址,这样当值发生变化的时候值也会被带回。
    这么看那对于引用类型而言加ref和不加就没有区别了吗?
    ? ? ? ? 答案是否定的。回到最初,值传递会将自己的值复制一个传递给形参,这样的话,实参和形参只是引用相同,方法中将形参重新初始化的时候(比如string类型),参数的值并不被带回。
    ? ? ? ? ?但是引用传递不一样了,它是将自己的地址传递给形参,这样的话实参和形参公用一个地址,当你在方法内无论你如果初始化形参,其值始终都会别带回。

    cs