总目录
前言
主要介绍ref 和 out 的使用,同时简单了解一下堆栈以及传值和传址赋值的区别。
一、传值赋值和传址赋值
1.堆栈
堆栈简单来说,就是计算机存储数据的一个数据模型。
模型分为堆和栈两部分,栈中主要存放一些简单结构的数据和复杂数据的索引,堆中存储复杂数据结构的数据内容。
简单的数据结构就是值类型,复杂数据结构就是引用类型
2.传值赋值和传址赋值
- 传值赋值:赋值运算符操作的是值类型数据或字符串
- 传址/引用赋值:赋值运算符操作的是引用类型数据,除字符串
通过案例解释一下:
static void Main(string[] args)
{
string astr = "1024";
//将astr的值 赋值给 bstr
string bstr = astr;
//重新给astr 赋值
astr = "2048";
//输出结果
Console.WriteLine($"astr:{astr},bstr:{bstr}");
//结果 astr:2048,bstr:1024
Console.ReadLine();
}
由上可知我们在对值类型以及字符串进行赋值的时候,是将值进行的复制。
static void Main(string[] args)
{
string[] astrArr = { "张三1","张三2", "张三3" };
//将astrArr 赋值 给bstrArr
string[] bstrArr = astrArr;
//更改astrArr[2] 的值
astrArr[2] = "李四2";
//输出
Console.WriteLine($"bstrArr[2]:{bstrArr[2]}");
//结果 bstrArr[2]:李四2
Console.ReadLine();
}
由上可知我们在对引用类型(除字符串)进行赋值的时候,是将数据内容的索引或叫地址进行的复制,两个数组指向同一个地址,因此修改其中一个数组的内容,另一个数组也会变化。
二、ref 和 out
1.异同点
相同点:ref和out 都是传址的,执行方法后,原来的值都会改变。
不同点:
- 使用ref时,传入的参数必须初始化,而使用out时不需要初始化
- ref能把参数的值传进方法,而out要把参数的值清空,退出方法时,所有out参数必须赋值
- out 更侧重输出,即是说将传进方法的参数,自行在内部赋值,然后给到外部使用,正因它是必须在内部赋值,所以它不在乎该变量是否有初始值
- ref 更侧重修改,即是说传进方法的参数本身就有值,在方法内部对变量值进行修改,它只是对变量的值进行修改,因此他要求变量必须有初始值
2.案例说明
private static void testRef(ref int a,ref int b)
{
a = b;//可以不做任何操作,因为它们是必须有初始值的,这里是将b赋值给a
}
private static void testOut(out int a,out int b)
{
a = 11;
b = 22;//必须赋值,否则报错,因为它们不一定有初始值
}
static void Main(string[] args)
{
int num1 = 1111, num2 = 2222;
//使用ref的时候必须赋初始值,然后在方法内部进行修改
testRef(ref num1,ref num2);
Console.WriteLine($"num1={num1},num2={num2}");
//输出结果:num1=2222,num2=2222
int x, y;
//使用out,必须在方法内部赋值
testOut(out x,out y);
Console.WriteLine($"x={x},y={y}");
//输出结果:x=11,y=22
Console.ReadLine();
}
ref和out 从某个角度来说,可以解决C#中只能有一个返回值的问题。
总结
以上就是今天要介绍的内容,希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。