在学习C#过程中,遇到了ref和out关键字。他们两的用法很像但是又有所不同,在深入了解后结合自己的看法,做个笔记总结一下。小白第一次写博文,如有什么错误的地方欢迎指正
认识ref和out
要发现两个关键字之间的不同,那我们就要先单独认识这两个关键字。
ref关键字
ref 关键字指示参数进行引用传递。使用引用传递的效果是,在所调用方法中对参数进行的修改都会反应在调用方法中。如果要使用 ref 参数,方法定义和调用方法均必须显式使用 ref 关键字。
out关键字
out 关键字通过引用传递参数,这和ref 关键字类似。不过在使用ref 关键字的时候必须在传递之前对变量进行初始化。同样要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字。
案例
下面用一个很简单的例子来解释两者的不同之处
第一种情景:在传递前没有进行参数初始化
ref:
//定义一个加1方法
static void Add(ref int n)
{
n += 1;
}
static void Main()
{
int number;
Add(ref number); //报错:使用了未赋值的局部变量"number"
Console.WriteLine(number);
Console.ReadKey();
}
out:
//定义一个加1方法
static void Add(out int n)
{
n += 1; //报错:使用了未赋值的out参数"n"
}
static void Main()
{
int number;
Add(out number);
Console.WriteLine(number);
Console.ReadKey();
}
在没有进行参数初始化的情况下,两个关键字都出现了报错。ref关键字报错指向了number没有赋值,out关键字报错指向了n没有赋值。
第二种情况:我们在传递之前初始化参数number
ref
//定义一个加1方法
static void Add(ref int n)
{
n += 1;
}
static void Main()
{
int number = 5;
Add(ref number);
Console.WriteLine(number); //输出 6
Console.ReadKey();
}
out
//定义一个加1方法
static void Add(out int n)
{
n += 1; //报错:使用了未赋值的out参数"n"
}
static void Main()
{
int number = 5;
Add(out number);
Console.WriteLine(number);
Console.ReadKey();
}
在有初始化参数的情况下,ref关键字输出正确。而out关键字还是报错,这时我们猜想,会不会再被调用方法中要自己初始化参数n。
第三种情况:out关键字下,传递前初始化参数number,被调用方法内初始化参数n
//定义一个加1方法
static void Add(out int n)
{
n = 1; //当修改到此,已无报错。我们立即输出
}
static void Main()
{
int number = 5;
Add(out number);
Console.WriteLine(number); //输出 1
Console.ReadKey();
}
第四种情况:out关键字下,被调用方法内初始化参数n
//定义一个加1方法
static void Add(out int n)
{
n = 1;
}
static void Main()
{
int number;
Add(out number);
Console.WriteLine(number); //输出 1
Console.ReadKey();
}
在第三第四种情况下out关键字都输出1,可以推出out关键字在传递前可以不初始化参数。
总结:
- ref关键字在传递前需要进行变量初始化,而out关键字可以不要。
- out关键字,在被调用方法内需要再进行一次初始化。
个人心得
- ref和out都是引用传递,但引用传递和引用类型是不同的概念。无论是值类型还是引用类型,ref和out都可以进行修改。
- 使用ref时类似于从家去学校,家里家人叫你小名,学校里别人叫你大名,但无论你在家还是在学校都是你自己,所以你在去学校之前一定要确认自己是真实存在的人即给自己初始化一下,这也就是你无论在哪个地方发生改变,其实都是在改变自己。
但是使用out时有点类似于你在家,
不过你叫别人顶替你的名字去学校。这时候你在家确定自己真实存在不存在无所谓,反正你又不去学校。不过顶替你的人,去了学校要确定下自己的存在即初始化。等那个人回家,他身上的东西就是你的东西,因为在别人看来他就是你,所以你会得到他身上的值。