通常时候,我们使用方法,向方法中传递的值都是一个备份,当方法使用完毕,这个备份也将在内存中被销毁。但是也有很多情况下,方法运行结束后,传递的值发生改变,而调用者需要这些改变后的值。于是这时候我们就引入了两个关键字 ref 和out. 一.相同点 Out和ref都用于改变引用参数的情况,并且部分情况下可以通用: namespace out和¨ªref { class Program { static void Main(string[] args) { test1(); Console.ReadKey(); } static void test1() { string str="Hello,World!"; test2(ref str); Console.WriteLine(str); } static void test2(ref string str) { str="nihao"; } } } 以上例子中,将ref更换为out之后,输出结果依然一致 二.不同点 1.如下例子: namespace out和¨ªref { class Program { static void Main(string[] args) { test1(); Console.ReadKey(); } static void test1() { string str="Hello,World!"; test2(out str); } static void test2(out string str) { Console.WriteLine(str);//这时候程序编译失败:使用了未赋值的out参数 } } } 由此可见:out在进入方法时会重新恢复清空状态 而如果将ref换成out则没有任何异常 因为得出结论:ref进入方法时会重新清空自己。 2.如下例子 namespace out和¨ªref { class Program { static void Main(string[] args) { test1(); Console.ReadKey(); } static void test1() { string str; test2(ref str); Console.WriteLine(str);//程序报错:使用了未赋值的局部变量 } static void test2(ref string str) { str = "Hello,World!"; } } } 以上情况程序再次报错:使用了未赋值的局部变量, 而将方法中的ref换成out之后则程序正常。 由此可见:ref在使用前必须赋值!而out本身进入方法时就会自动清空。 综合以上分析得出结论:两个关键字都可以实现方法中传出多个值,ref更适合用于需要使调用者的值发生改变的地方;out更多用于方法中输出多个值的情况。
|