C#同样是引用,ref和out到底有什么区别?
Posted 杂物间的无聊生活
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#同样是引用,ref和out到底有什么区别?相关的知识,希望对你有一定的参考价值。
前言
在C#中,ref和out是很特殊的两个关键字。使用它们的时候就可以让参数按照引用来传递。
通常我们向方法中传递的是一个值,方法获得的是这些值的一个拷贝,然后再使用这些拷贝,当方法运行完后,这些拷贝就将被丢弃,但是原来的值不受到影响。
但是有时,我们需要改变原来变量中的值,所以我们可以向方法传递变量的引用,而不是变量的值。
引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值。变量的值储存在内存中,当我们创建一个引用并且修改它时,修改的是内存中的值,因此这个变量的值就被修改。
但是这两个关键字的功能有稍许不同,我们先看一个简单的例子:
static void TestRefAndOut()
{
string s1 = "What the hell";
TestRef(ref s1);
Console.WriteLine(s1); //output: What the hell
}
static void TestRef(ref string str)
{
str = "Hello world";
}
成功编译并输出,其实如果把ref改成out也是一样的,那这两个关键字的区别是什么呢,继续测试:
static void TestRefAndOut()
{
string s1 = "What the hell";
TestRef(ref s1);
}
static void TestRef(ref string str)
{
Console.WriteLine(str); //output: What the hell
}
static void TestRefAndOut()
{
string s1 = "What the hell";
TestOut(out s1);
}
static void TestOut(out string str)
{
Console.WriteLine(str); //compile does not pass
}
out作为参数进入方法的时候,C#会自动清空它的一切引用和指向,所以在上面out的例子中,必需先给str赋值,如下:
static void TestRefAndOut()
{
string s1 = "What the hell";
TestOut(out s1);
}
static void TestOut(out string str)
{
str = "Surprise Motherf**ker"
Console.WriteLine(str); //output: Surprise Motherf**ker
}
所以我们得到第一个区别:out作为参数进入方法之后会清空自己,所以必须在方法返回之前或者使用这个out参数之前给out参数赋值;而ref不需要在被调用方法使用前赋值,而且传入方法之后它并不会有什么改变
再来看两段代码:
static void TestRefAndOut()
{
string s1;
TestRef(ref s1);
Console.WriteLine(s1); //compile does not pass
}
static void TestRef(ref string str)
{
str = "What the hell";
}
static void TestRefAndOut()
{
string s1;
TestOut(out s1);
Console.WriteLine(s1); //output: What the hell
}
static void TestOut(out string str)
{
str = "What the hell";
}
这回,ref这段代码无法编译了,s1是一个空引用,所以无法使用,而out因为上述那个原因,他不在乎s1是不是空引用,因为就算s1不是空引用,它也会把s1变成空引用。
从上面的代码可以得出第二个区别,ref参数在使用前必须初始化,但是out不需要。
总结
out参数在进入方法后,在使用这个out参数或者方法返回之前必须赋值;ref参数在使用前必须初始化。
嗝,没了。小伙伴们是不是觉得很简单呢?2333
以上是关于C#同样是引用,ref和out到底有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章