ref和out的区别

ref和out的区别

第1个回答  2009-12-02
最近在许多论坛上看到关于了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是只出不进。经典!!!本回答被提问者采纳
第2个回答  2015-07-04
还是以例子来表明吧;
1. ref:
int i =0;
有函数fun(ref i)和fun(i)
它们的函数体都是{ i = 3;},那么在执行以下两段代码后:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(1)的输出是1,(2)的输出是3,

2. out:
int i; //注意,这样个里就是声明了变量i,并木有对其初始化
有函数fun(ref i)、fun(out i)和fun(i)
它们的函数体都是{ i = 3;},那么在执行以下三段代码后:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(3)int i = 0; fun(out i); System.Console.WriteLine(i.ToString());
(1)和(2)在编译的时候都会报错:不准确 CS0165: 用了未赋值的局部变量“i”
而(3)能正常编译,而且输出3

最后总结一次:
Ref和Out这样个2个关键字都能够提供相似的功效,其作用也很像C中的指针变量。稍有不相同之处是:
用Ref型参数时,传入的参数必须先被初始化。而Out则不要要,对Out而言,就必须在方法中对其完成初始化。
用Ref和Out时都必须注意,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
Out更适合用在要要Return多个返回值的地方,而Ref则用在要要被调出使用的方法修改调出使用者的引用的时候。
第3个回答  2012-07-21
更简单理解,out相当于多了一个return,ref相当于一个全局变量~~~
第4个回答  2019-08-23
首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。经典!!!
具体引用地址:
http://zhidao.baidu.com/question/127749691.html
第5个回答  2013-04-12
长话短说吧,
ref是必需要先初始化才能用,但调用时可以对它什么也不做.
out可以不初始化也能用,但调用时一定要对其赋值(即使已经初始化的也要赋值,哪怕是赋一个和原来一样的值).

ref和out的区别是什么?
3、传递到ref参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。尽管ref和out在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用ref参数,而另一个方法采用out 参数,则无法重载这两个方法。

ref和out的区别
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只出不进。ref和out的区别在C# 中,既可以通过值也可以通过引用传递参...

ref参数和out参数是什么?有什么区别?
ref参数是引用,out参数为输出参数。

Ref 与out有什么不同?
如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref 和 out 方面不同的重载。

概括一下ref和out的各自特点,区别。
ref:将一个变量带入方法中,在方法中计算变量改变其数值再带出方法。也就是不用再返回数值类型。out:一个方法只可以返回一个数值类型,用out可以返回多个,但要在方法里为其赋值。

c# ref和out区别仅仅是参数需不需要初始化?
ref和out使用时的区别是:①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。一:ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在...

ref和out的作用于区别是什么?
ref和out都是引用地址 ref可以理解为引用传值,一个构造器或方法里含有ref参数,任何使用这个构造器或方法的地方操纵的都是同一个变量,ref所修饰的变量,也就是说。。。和你定义全局变量或者static变量差不多的[效果].out我个人感觉和ref使用差不多啊,网上有人说值传递,还说传递之前必须初始化,不...

out 与ref区别
out在方法体内必须被赋值,而ref不用!,out是向外面返值,ref即可接受也可返回值!

ref与out区别是什么?
ref 英 [ref] 美 [rɛf]n.裁判员 复数: refs out 英 [aʊt] 美 [aʊt]adv.出局;在外,在外部;完全,彻底;出版 prep.(表示来源)从;(从…里)出来;(表示不在原状态)脱离;离去 vt.使熄灭;揭露;驱逐 adj.外面的;出局的;下台的;外围的 n.不流行;出局 ...

实际开发中ref,out参数有多大作用
理论上来说,out就是多返回值,可以用返回Tuple替代,ref就是传递引用,可以用wrapper对象替代。但在特定场景,你想要好用性能高,没有值类型和这俩东西,你就做不到。

相似回答