黑马程序员技术交流社区
标题: 详细总结了一下out和ref的区别,不足之处请指教 [打印本页]
作者: 朱传波 时间: 2013-3-17 08:02
标题: 详细总结了一下out和ref的区别,不足之处请指教
通常时候,我们使用方法,向方法中传递的值都是一个备份,当方法使用完毕,这个备份也将在内存中被销毁。但是也有很多情况下,方法运行结束后,传递的值发生改变,而调用者需要这些改变后的值。于是这时候我们就引入了两个关键字 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更多用于方法中输出多个值的情况。
作者: 许庭洲 时间: 2013-3-19 20:36
值得学习ing!
作者: 张振 时间: 2013-3-24 19:28
好好借鉴下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |