1. What is ref & out ?
参数传递时按引用传递参数
2.Why need ref & out ?
按值传递是通过将实参的值Copy到形参,来实现将值传递到方法。CLR会1)给形参分配空间 2)将实参值复制到形参
//假设需要交换两个数 void Swap(int a,int b){ int temp = a; a = b; b = temp; } --------------------------- int a = 1; int b = 2; Swap(1,2); 结果a仍为1,b仍为2
因为参数传递时是默认按值来传递的
所以这样并不能完成值得交换。Swap方法在内部操作得并不是a,b变量本身,而是它得克隆
,而当我们需要变量在方法执行以后也做了相应改变时,我们就需要按引用传递参数的方式,于是就需要ref 和 out 这种可以使变量按引用传递地关键字。此外,由于按引用传递的参数,CLR将不再为形参分配新内存,形参相当于实参的一个别名,它们指向同一个内存地址空间,节省内存且效率更高。
3.How to understand 引用类型 & 值类型?
假设我有一个很漂亮地风筝,然后你想要风筝,这时候我不是给你买一个和我一模一样的风筝,而是把我风筝的线交给你,至于你怎么处置这个风筝全看你自己。你所做得每一个动作都将直接作用于风筝本身,而不是作用于和它一模一样的副本。
值类型就相当于买的一个和我一模一样的风筝,引用类型就相当于是我的风筝的线
4.what the same thing for ref & out ?
out & ref 都是按引用传递的,作用后都将改变原来参数的数值。
int a = 1; int b = 2; Swap(ref a, ref b) // a = 2, b = 1
5.what the difference between ref & out ?
- ref
有进有出
参数传入前必须初始化否则报语法错误,传入参数在函数内部不会重新初始化可以直接使用。ref 多用于操作某个后续仍需继续使用
的变量场景- out
只进不出
参数传入前可以不初始化,但是传入后在函数内部必须先重新初始化后再使用,所以不管参数传入前的值是多少,传入函数后都会被初始化赋值后返回。out 多用于返回多个返回值
的场景(如bool int.tryParse(string, out i)同时返回bool 和 i)