C#?中ref与out理解

来源:百度文库 编辑:神马文学网 时间:2024/04/29 09:06:10

C# 中ref与out理解

(2008-05-14 13:56:02)转载 标签:

杂谈

分类:编程 一 ref关键字:
1 参数为值类型:
1)不用ref修饰:函数中对参数的修改无效,因为传递的是参数的一个拷贝,函数只是对拷贝进行操作,拷贝的生命期在函数执行完毕时也到期了,所以修改无效。
2)使用ref修饰:函数对参数的修改有效,ref指定为引用传递。

2参数为引用类型:
1)当在函数中不通过new为参数重新指定对象时,与没有用ref关键字没有区别。(很少此时使用)
2)当在函数中通过new为参数重新指定对象时,函数对该参数的修改实质是对新对象的修改,函数结束后,新对象的内存将被回收,所有原来的对象仍然没有被修改。(没有实现预期目标,不在此时使用)

使用注意:
1)ref参数必须是变量,不能是常量。
2)必须使用初始化的变量。

二:out关键字
return只能返回一个参数,若返回多个参数则使用out参数。在函数内部对参数值进行修改,然后通过out参数返回。out 参数在调用函数前的赋值是被忽略的,也就是说与方法调用前的值无关,所以只要声明过就可以了。out在调用函数里必须赋值,语法检查里能确保这个变量确实被函数修改了。
1参数为值类型
1)不用out修饰:函数中对参数的修改无效,因为传递的是参数的一个拷贝,函数只是对拷贝进行操作,拷贝的生命期在函数执行完毕时也到期了,所以修改无效。
2)使用out修饰:函数内部对out参数值进行修改,直接导致函数外部参数的值变化,因为out也是引用传递,这个与ref同,区别是必须在函数内部对参数进行一次赋值。(通过函数获取参数值的情况下使用)

2参数为引用类型
1)当在函数中不通过new为参数重新指定对象时:程序会报错,要求首先实例化。
2)当在函数中通过new为参数重新指定对象时:对参数进行修改,并将对象通过out参数传递到函数外,所以在函数外不必对参数实例化,只要申明即可。

总结:
值类型参数:ref效果=out效果!=“不使用”效果;
引用类型参数:
函数中不实例化:ref=out="不使用";
函数中实例化:ref!=“不使用”;out!="不使用";

使用场合:
1)参数为引用类型时不需要使用ref,参数为值类型且需要在函数中修改值类型参数的值,使用ref;

2)参数为引用类型,需要返回函数中实例化的对象使用out;

3)事先不确定一个值类型的参数值,通过函数来给其赋值使用out。