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。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。