日期:2014-05-18  浏览次数:20944 次

ref应该在什么情况下使用?
今天接手去维护扩展公司前辈做的模块,看了他的代码,看来是自己能力真有问题,看得头晕晕的,
前辈写的方法只要有参数,基本都会用ref,但没发觉这个值进入方法主体后都有改变,总之是参数80%都用到ref,
我真知道这样的好处最大是什么?

------解决方案--------------------
不也可以怀疑是坏处吗?
------解决方案--------------------
比如我们写 a = b + 1; 

这个代码保证 b 不被修改,这就给别人带来的安慰。而你的所谓“前辈”看来喜欢逃避责任,他一定要告诉你 b 被改变了然后让你猜改变成了什么。
------解决方案--------------------
ref是传递参数的地址,ref 传递参数前,必须先对变量初始化(赋值)
好处嘛,大概就不用做一件事情还没完,就要返回值给变量
C# code

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

------解决方案--------------------
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
------解决方案--------------------
探讨
比如我们写 a = b + 1;

这个代码保证 b 不被修改,这就给别人带来的安慰。而你的所谓“前辈”看来喜欢逃避责任,他一定要告诉你 b 被改变了然后让你猜改变成了什么。

------解决方案--------------------
ref 关键字使参数按引用传递(传递参数的地址);ref 传递参数前,必须先对变量初始化(赋值)。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。简单点说就是,使用了ref和out的效果就几乎和C中使用了指针变量一样。它能够让你直接对原数进行操作.

不知道对不对了.
------解决方案--------------------
探讨
引用:
不要去轻易维护这种系统,它一定是乱了。


这个我可没权力说接就接不接就不接,打工的,
其实本身我也有用过ref,但比较少,上个模块我写了1W行代码也就用了三四次,
前辈这里是一个类一大半的方法都用,我和我同事都很费解,如果多用好,那我
得好好学习。

------解决方案--------------------
er...
不能一边倒的说不好。你贴一段代码来看看是否必要吧。
我猜测2个可能
1.的确需要这样写,因为要返回多个参数,但他不太了解面向对象的思路,没有创建类的习惯,其实返回多个参数的情况如果类似,可以吧返回多个结果写个类。可能都是返回结果不同但又需要返回多个参数?
2.可能是c/c++转来的,认为传递引用会快一些。

给你建议一下,尽量少的重构他的代码,即便是很熟练c#的人,也会一不小心就出错的。因为不习惯这种写法,会有思考盲区的。
------解决方案--------------------
ref 少用

------解决方案--------------------
只能同情一下你了。
------解决方案--------------------
我基本不用ref,到现在都还不怎么理解ref有什么好处
------解决方案--------------------
C++的脑袋还没转过来弯,还不知道不用指针怎么办造成的后遗症吧……

目前为止我还真没发现自己接触的项目中有哪个方法非要用ref不可的……
------解决方案--------------------
ref 是函数在提示调用方,我可能会直接修改你的变量。这就是 ref 的语义。这对于引用类型基本上是没什么意义的。对于大的值类型,使用 ref 传参可能会略略提升性能,但是性能与语义相比意义不大。在.net类库里,ref 和 out 的使用是非常少的(out 与 ref 很相似)。有些值类型的 Parse 方法用到 out,而用到 ref 的我一时只能想到 InterLocked.Increment,我们可能要针对同一个 int 多次调用 Increment,因此这个 ref 的使用是合理的。这两个是使用 ref 和 out 的典型场景,而这两个场景并不常见。如果代码里到处充斥着 ref,那几乎可以肯定,这是前辈的陋习。
------解决方案--------------------
探讨
引用:
C++的脑袋还没转过来弯,还不知道不用指针怎么办造成的后遗症吧……

目前为止我还真没发现自己接触的项目中有哪个方法非要用ref不可的……


我也是第一次见那么喜欢用ref的程序员,方法之间调用多了,都不知道值在哪里改变了

主要还是一点,有些参数用了ref从头到尾也没见重新赋个值,维护起来真吃力

------解决方案--------------------
有的时候也会用到ref,比如说返回值需要有多个的时候。当然是可以通过设计来避免的。

尤其是方法内部需要修改参数是值类型的数据。

void SetSomeSth(ref int result1, ref int result2)

我自己很少用,主要是有悖于正常的习惯。关键是方法名一定要明确可懂,突出这个方法的作用。
------解决方案--------------------
方法内部需要修改参数是值类型的数据

------解决方案--------------------