读书人

ref应该在什么情况下使用?解决方案

发布时间: 2012-03-28 15:40:03 作者: rapoo

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)

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

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


传递到 ref 参数的参数必须最先初始化。
这与 out 不同,out 的参数在传递之前不需要显式初始化。

class RefRefExample
{
static void Method(ref string s)
{
s = "changed ";
}
static void Main()
{
string str = "original ";
Method(ref str);
// str is now "changed "
}
}


class OutReturnExample
{
static void Method(out int i, out string s1, out string s2)
{
i = 44;
s1 = "I 've been returned ";
s2 = null;
}
static void Main()
{
int value;
string str1, str2;
Method(out value, out str1, out str2);
// value is now 44
// str1 is now "I 've been returned "
// str2 is (still) null;
}
}


[解决办法]
!学习来的!
[解决办法]

探讨
传递到 ref 参数的参数必须最先初始化。
这与 out 不同,out 的参数在传递之前不需要显式初始化。


[解决办法]
在参数值经过函数时会发生变化时,才用ref 一般不需要
[解决办法]
建议LZ先去掉一些,看是否能正常跑吧。
[解决办法]
探讨
引用:
建议LZ先去掉一些,看是否能正常跑吧。

去掉一些,大部分方法都用了ref,不知道去掉哪个,到底哪个值改变了,反正是只要是参数基础就用ref,
让我感觉真有点像24楼说的一样,“关键是方法名一定要明确可懂,突出这个方法的作用”,但这个并不是很明确,返回值都不明确,几个参数进入一个方法,之间又是ref方法调用ref方法,哎。。。。

读书人网 >C#

热点推荐