通常时候,我们使用方法,向方法中传递的值都是一个备份,当方法使用完毕,这个备份也将在内存中被销毁。但是也有很多情况下,方法运行结束后,传递的值发生改变,而调用者需要这些改变后的值。于是这时候我们就引入了两个关键字 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本身进入方法时就会自动清空。