ref 和 out 的区别

qingyun27sc 2010-01-20 10:00:09
刚刚随便写了几条代码测试了下,感觉ref 和 out的区别是不是就是,一个要初始化值,另一个不要求初始化值?
...全文
138 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
spmzfz 2010-01-20
  • 打赏
  • 举报
回复
我的感觉是:
REF 是传一个数去处理,OUT 是循便带一个数回来。
在调用时,REF必须初始化,而OUT则不需要。
REF 和OUT 都将致参数通过引用传递。
qingyun27sc 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 linux7985 的回复:]



ref是申请了变量之后呢,给函数体用,
out则是,在函数里构造了这个对象后,给实参赋值的
[/Quote]


这个解释得很清楚 O(∩_∩)O谢谢
烈火蜓蜻 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wiki14 的回复:]
首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。
[/Quote]

ref是申请了变量之后呢,给函数体用,
out则是,在函数里构造了这个对象后,给实参赋值的
SQL77 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qingyun27sc 的回复:]
引用 3 楼 sql77 的回复:
OUT不用初始化呀,这是用来输出的,利用其它求出来赋值给它
REF 是引用传递,


这个有点不对,函数外部未初始化,OUT应该在函数里面会有初始化的要求吧
[/Quote]
这肯定呀,要不然输出什么东西呀
qingyun27sc 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 leafold 的回复:]
是的,这是一个重要的差别。
还有一些作用就是通过动态编译,编写代码时可以避免试图向out类型参数传入的错误使用。
[/Quote]


这个还没有用到过 学习了 O(∩_∩)O~
linglinghao 2010-01-20
  • 打赏
  • 举报
回复
//关于ref
class RefTest {
/* This method changes its argument.
Notice the use of ref. */
public void sqr(ref int i) {
i = i * i;
}
}

class RefDemo {
public static void Main() {
RefTest ob = new RefTest();

int a = 10;

Console.WriteLine("a before call: " + a);

ob.sqr(ref a); // notice the use of ref

Console.WriteLine("a after call: " + a);
}
}

//关于out
class Decompose {

/* Decompose a floating-point value into its
integer and fractional parts. */
public int parts(double n, out double frac) {
int whole;

whole = (int) n;
frac = n - whole; // pass fractional part back through frac
return whole; // return integer portion
}
}

class UseOut {
public static void Main() {
Decompose ob = new Decompose();
int i;
double f;

i = ob.parts(10.125, out f);

Console.WriteLine("Integer portion is " + i);
Console.WriteLine("Fractional part is " + f);
}
}
qingyun27sc 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyq11 的回复:]
ref 先初始化
out 在方法里初始化
在方法里改变的参数 用ref

[/Quote]

在方法里改变的参数 用ref 这句话,有点想不明白了~~~~(>_<)~~~~
leafold 2010-01-20
  • 打赏
  • 举报
回复
是的,这是一个重要的差别。
还有一些作用就是通过动态编译,编写代码时可以避免试图向out类型参数传入的错误使用。
qingyun27sc 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sql77 的回复:]
OUT不用初始化呀,这是用来输出的,利用其它求出来赋值给它
REF 是引用传递,
[/Quote]

这个有点不对,函数外部未初始化,OUT应该在函数里面会有初始化的要求吧
qingyun27sc 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wiki14 的回复:]
rel是有进有出,out是只出不进。
[/Quote]

貌似有点这个意思
wuyq11 2010-01-20
  • 打赏
  • 举报
回复
ref 先初始化
out 在方法里初始化
在方法里改变的参数 用ref
wiki14 2010-01-20
  • 打赏
  • 举报
回复
首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。
bancxc 2010-01-20
  • 打赏
  • 举报
回复
SQL77 2010-01-20
  • 打赏
  • 举报
回复
OUT不用初始化呀,这是用来输出的,利用其它求出来赋值给它
REF 是引用传递,
十八道胡同 2010-01-20
  • 打赏
  • 举报
回复
C#中ref和out的区别 收藏
最近在许多论坛上看到关于了ref和out的区别,发现解释的都不非常理想。
  我想抄写点官方的解释,然后再来我自己的解释

//如下

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。

//上面的理解起来非常不好理解。下面我说说我自己的看法。

首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。经典!!!
http://blog.csdn.net/mydriverc/archive/2007/08/07/1729182.aspx
huwei12345 2010-01-20
  • 打赏
  • 举报
回复
表面上是这样的

从内存来分析就明白了

110,533

社区成员

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

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

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