方法里的传参问题

liumu1209 2010-07-06 11:53:04

class ReVal
{
public ReVal(int i)
{
_i = i;
}
public int _i;
}

class Program
{
static void Main(string[] args)
{
ReVal rrv = new ReVal(5);
test(rrv); //这里与 test(ref rrv) 有什么区别?
}

static int test(ReVal rv)
{
rv._i = 10;
return rv._i;
}
}


我看 《C#本质论》P117讲参数默认是传值。上例 test(rrv) 是将rrv副本传给test方法,test方法结束后,又将这个副本复制到 rrv对象上?

test( rrv ) 与 test(ref rrv) 有什么区别
...全文
137 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
brawei 2010-07-06
  • 打赏
  • 举报
回复
test( rrv ) 与 test(ref rrv),都会传回rrv,rrv._i都会是10,因类对象是引用类型的,不管写不写ref,它都是对原对象的指针引用。
denbes 2010-07-06
  • 打赏
  • 举报
回复
ReVal 是引用类型如果没有 ref 这个参数,形参与实参之间是分开的,就是说形参的所有变化不对实参起作用.
反之,如果Reval是值的话,形参变化了,实参也会随着形参改变而改变.
swimmingfish2004 2010-07-06
  • 打赏
  • 举报
回复
To crwei86:
ref传递可以看做是C++中的引用变量作为函数的参数的情形,而C++中的指针传递也是值传递(形参是实参的副本),只不过这个值是一个地址罢了,所以看起来好像是引用传递。
ctwei86 2010-07-06
  • 打赏
  • 举报
回复
ref传递可以看做是指针传递。
swimmingfish2004 2010-07-06
  • 打赏
  • 举报
回复
“test( rrv ) 与 test(ref rrv) 有什么区别”
如果是test(ref rrv)则实参和形参是同一个。test( rrv )则形参是实参的一个副本,但是两种情况下的rv._i都是一样的。
swimmingfish2004 2010-07-06
  • 打赏
  • 举报
回复
ReVal是引用类型,所以在调用static int test(ReVal rv)时,传到函数体内部的确实是一个引用的副本,但是这个值相当与C++中的指针,虽然指针是复制了,但是它们都是指向一个内存位置。所以在函数体内rv._i = 10;虽然用的是引用的一个副本,但是它们指向的是同一个内存位置,也就是说实参的rv._i和形参的rv._i实际上是同一块区域。这样解释楼主可理解了。
LovingAlison 2010-07-06
  • 打赏
  • 举报
回复
test(rrv);
执行完后 rrv的值不变 即使test方法对rrv做过处理
test(ref rrv)
执行完后 rrv的值改变 如果test方法对rrv做过处理
边城的刀声 2010-07-06
  • 打赏
  • 举报
回复
你这个例子是看不出test(rrv)和test(ref rrv)的区别的,因为rrv是引用类型,传的值是对rrv对象的引用,
如果

static void test(ReVal rv)
{
rv = new ReVal(10);
}
rv._i这时的结果还是5;传的是值,只不过这个值是对对象的引用
static void test(ref ReVal rv)
{
rv = new ReVal(10);
}
rv._i这时的结果是10,因为传的是引用

angel6709 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 blogtjf 的回复:]
看看ref 和out的区别吧,就知道 了OK
[/Quote]
看ref out in 区别
宇峰科技 2010-07-06
  • 打赏
  • 举报
回复
看看ref 和out的区别吧,就知道 了OK
angel6709 2010-07-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 angel6709 的回复:]
记住一点,C#中所有的参数传递都是值传递(in)
[/Quote]
不好意思,默认的情况下。。。
angel6709 2010-07-06
  • 打赏
  • 举报
回复
记住一点,C#中所有的参数传递都是值传递(in)

110,533

社区成员

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

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

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