小鱼儿-fly

c#,ASP.NET 一条艰辛而漫长的道路...千里之行,始于足下!

导航

C# :ref与out区别

Posted on 2010-10-26 10:14  小鱼儿-fly  阅读(273)  评论(0编辑  收藏  举报

1.为什么要使用ref与out?

在C#中数据类型有两种:值类型与引用类型。

当函数传参时,对于值类型变量,传出的是其值。值类型数据储存在stack中,真实值得位置也就是在堆栈中存储的实例。被调用的方法得到的是变量的一个副本,在方法退出后对变量的修改就会丢失。

当函数传参时,对于引用类型变量,有两种方式:传值,传引用。引用类型数据存储在heap中,每存储一个变量,堆中都将有有一引用值指向其实例。被调用的方法得到的就是这个变量,在方法退出后对于变量的改变仍有作用。

所以当传参时,一般情况下也就是不用使用ref,out关键字时,都是通过值传参。若想只传出引用变量的引用值时,就使用ref与out关键字。

2.ref的定义

迫使值参数通过引用传送给方法。所以无论是值类型还是引用类型,一旦使用了ref,该方法对变量所做的任何改变都会影响原来对象的值。再调用方法期间,ref 参数显式传递到方法。并且变量必须初始化。

3.out的定义

使用out关键字,表示该变量用过引用传送,且传递给该方法的变量可以不初始化,但如果在函数体中没有给out参数分配一个值,该方法就不能编译。out 参数显式传递到方法

 

综上所述ref与out的区别:

1.使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2.使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3.out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

 

PS:   在C#中,方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。