ref应该在什么情况下使用?

mydear303 2010-11-09 02:56:54
今天接手去维护扩展公司前辈做的模块,看了他的代码,看来是自己能力真有问题,看得头晕晕的,
前辈写的方法只要有参数,基本都会用ref,但没发觉这个值进入方法主体后都有改变,总之是参数80%都用到ref,
我真知道这样的好处最大是什么?
...全文
645 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsjrzjp 2012-03-27
  • 打赏
  • 举报
回复
一直没理解透
sgchen 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ajq1989 的回复:]
引用 3 楼 sp1234 的回复:
比如我们写 a = b + 1;

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


费解。


我偶尔用。 这不好么?ref and out ??我的理解错误了?
[/Quote]

sp1234老大说话一向说话都象机械工业出版社翻译的英文书,这就是sp(水平)。

mydear303 2010-11-11
  • 打赏
  • 举报
回复
非常非常感谢各位朋友的意见,受教了
现在我又有个关于调用web服务的问题,昨天找了一天资料也没找到一个感觉可以解决的办法:
http://topic.csdn.net/u/20101111/08/2a88883f-bdec-43d4-be34-69686b8901b9.html
路过的过去帮我看看,谢谢
mydear303 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 phil999 的回复:]
ref 是函数在提示调用方,我可能会直接修改你的变量。这就是 ref 的语义。这对于引用类型基本上是没什么意义的。对于大的值类型,使用 ref 传参可能会略略提升性能,但是性能与语义相比意义不大。在.net类库里,ref 和 out 的使用是非常少的(out 与 ref 很相似)......如果代码里到处充斥着 ref,那几乎可以肯定,这是前辈的陋习。[/Quote]
最后一句话我可不能说,前辈永远是辈,我现在的综合能力还是跟他有不少距离
phil999 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 mydear303 的回复:]
引用 30 楼 litaoye 的回复:
建议LZ先去掉一些,看是否能正常跑吧。

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

改他的代码绝对是不明智的
mydear303 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 phil999 的回复:]
引用 21 楼 mydear303 的回复:
引用 20 楼 shinnakoruru 的回复:
C++的脑袋还没转过来弯,还不知道不用指针怎么办造成的后遗症吧……

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


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

主要还是一点,有些参数用了ref从头到尾也没见重新赋个值……
[/Quote]

受教了
mydear303 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 litaoye 的回复:]
建议LZ先去掉一些,看是否能正常跑吧。
[/Quote]
去掉一些,大部分方法都用了ref,不知道去掉哪个,到底哪个值改变了,反正是只要是参数基础就用ref,
让我感觉真有点像24楼说的一样,“关键是方法名一定要明确可懂,突出这个方法的作用”,但这个并不是很明确,返回值都不明确,几个参数进入一个方法,之间又是ref方法调用ref方法,哎。。。。
绿色夹克衫 2010-11-10
  • 打赏
  • 举报
回复
建议LZ先去掉一些,看是否能正常跑吧。
xrongzhen 2010-11-10
  • 打赏
  • 举报
回复
在参数值经过函数时会发生变化时,才用ref 一般不需要
phil999 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 hxianling 的回复:]
传递到 ref 参数的参数必须最先初始化。
这与 out 不同,out 的参数在传递之前不需要显式初始化。

[/Quote]

没错,ref和out都是按地址传参,编译器对这两个关键字做了不同的限制,ref 参数在传参之前必须赋值,out参数在函数返回前必须赋值。因此,ref 是在提醒改变,而 out 则是承诺赋值
xiaoxiaogang 2010-11-10
  • 打赏
  • 举报
回复
!学习来的!
hxianling 2010-11-10
  • 打赏
  • 举报
回复
传递到 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;
}
}

_沐落 2010-11-10
  • 打赏
  • 举报
回复
方法内部需要修改参数是值类型的数据
机器人 2010-11-10
  • 打赏
  • 举报
回复
有的时候也会用到ref,比如说返回值需要有多个的时候。当然是可以通过设计来避免的。

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

void SetSomeSth(ref int result1, ref int result2)

我自己很少用,主要是有悖于正常的习惯。关键是方法名一定要明确可懂,突出这个方法的作用。
phil999 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mydear303 的回复:]
引用 20 楼 shinnakoruru 的回复:
C++的脑袋还没转过来弯,还不知道不用指针怎么办造成的后遗症吧……

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


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

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

C#里的变量有值类型和引用类型的分别,而C++没有对此作明确的区分。C++中“真正的”对象,其语义和C#值类型相似。比如这个简单的代码

void func(Student s)
{
s.name = "phil";
}
Student st;
func(st);

调用之后,st.name 保持不变,原因是在调用函数时,编译器根据 st 的状态使用拷贝构造函数初始化了参数 s,函数体中的 s 与 st 是两个完全不同,可以独立改变而互不影响的对象。为了改变 st 的值,我们可以把形参声明为引用:

void func(Student& s)

或指针:

void func(Student* s)

C# 中的引用类型相当于指针方式,ref 修饰符则相当于引用方式。我们通常不会在一个参数上同时使用两种方式(即传递指针的引用 Student*&),因为那是多余的。可见C++中对引用的使用是有其语言背景的,将其照搬到C#可能是类型意识淡漠的表现。
phil999 2010-11-10
  • 打赏
  • 举报
回复
ref 是函数在提示调用方,我可能会直接修改你的变量。这就是 ref 的语义。这对于引用类型基本上是没什么意义的。对于大的值类型,使用 ref 传参可能会略略提升性能,但是性能与语义相比意义不大。在.net类库里,ref 和 out 的使用是非常少的(out 与 ref 很相似)。有些值类型的 Parse 方法用到 out,而用到 ref 的我一时只能想到 InterLocked.Increment,我们可能要针对同一个 int 多次调用 Increment,因此这个 ref 的使用是合理的。这两个是使用 ref 和 out 的典型场景,而这两个场景并不常见。如果代码里到处充斥着 ref,那几乎可以肯定,这是前辈的陋习。
mydear303 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 shinnakoruru 的回复:]
C++的脑袋还没转过来弯,还不知道不用指针怎么办造成的后遗症吧……

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

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

主要还是一点,有些参数用了ref从头到尾也没见重新赋个值,维护起来真吃力
ShinNakoruru 2010-11-09
  • 打赏
  • 举报
回复
C++的脑袋还没转过来弯,还不知道不用指针怎么办造成的后遗症吧……

目前为止我还真没发现自己接触的项目中有哪个方法非要用ref不可的……
lone25 2010-11-09
  • 打赏
  • 举报
回复
我基本不用ref,到现在都还不怎么理解ref有什么好处
mydear303 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ajq1989 的回复:]
引用 16 楼 mydear303 的回复:
我现在才明白,高手写的代码不是每个程序员都能明白里面的精华的,现在只能和我同事眼瞪眼


这是你三四年程序员的总结么。
[/Quote]

能力不足,见笑了,所以现在一直升不上去,哈哈
加载更多回复(17)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧