好久没更新C#了,但是还是在继续学习哦,写博客就是在逐渐复习和不断推进的过程中,哈哈哈,继续加油
值传递
在C#学习笔记10-值类型和引用类型中,我们讨论了值类型和引用类型的区别:
1.值类型和引用类型在内存中存储的地方不一样,值类型存储在栈中,引用类型存储在堆中
2.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
那么值传递和引用传递的区别在哪呢?
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数,简单来说,值类型在传递时传递的是数值本身,我们来看一行代码
int num1 = 10;
int num2 = 20;
num2 = num1;
num2 = 30;
Console.WriteLine("num1 = {0}, num2 = {1}",num1 ,num2)
对于上述代码,其输出为多少呢?大家肯定会不加思索回答
num1 = 10;
num2 = 30;
对,这就是答案,这就是值传递,num2的改变不会影响到num1,用图来描述就是值类型中的值传递只是自个和自个玩,不会去打扰其他小伙伴,就像现在在家自我隔离的我们,每个人都有属于自己的空间而不去影响他人,哈哈哈
引用传递
那么引用传递呢?前面我们说到,引用类型的值是存放在堆中,引用类型的变量存放的是数据地址,所以,引用传递时传递的就是对这个对象的引用(即地址),因此一个发生改变以后,另一个也会发生改变
我们先从代码来分析一下引用传递,Person是一个类,即引用类型
Person p1 = new Person();
p1.Name = "张三";
Person p2 = new Person();
Person p = p1;
p1 = p2;
p2.Name = "李四";
p.Name = "abc";
Console.WriteLine(p1.Name);
Console.WriteLine(p2.Name);
对于上面的操作,大家又会给出一个什么答案呢?最后的输出是什么呢?
答案揭晓
p1.Name = "abc";
p2.Name = "abc";
这个看起来和前面很不一样,p1和p2的属性都发生了改变,但是我们明明没有对p1和p2的Name属性进行改动啊,那这是怎么回事呢?我们来利用图来分析一下
我们说过,引用类型是存放在堆中,而其变量存放的只是地址,所以在进行引用传递时候,是堆中的属性在发生变化,但是由于引用传递,p1将地址传给了p和p2.这个时候他们共用一个地址,所以当其中一个发生变化的时候其他的也会跟着改变,这也就是为什么当p.Name=“abc"时,p1.Name和p2.Name也会变化
但是,在引用类型中有一个特殊的存在—string类型
string 类型
在前面的博客C#学习笔记11-String的一些方法,我们提到字符串的一种特性,那就是字符串不变性:
当给一个字符串重新赋值时,原值并未销毁,而是在堆的空间中重新开辟一块空间进行储存
因此,这时候当我们对他进行引用传递时,传递的地址也会发生变化,地址不共用,因此他们不会相互影响,还是以一串代码来考考自己
string s1 = "张三";
string s2 = "李四";
string s = s1;
s1 = s2;
s = "abc";
Console.WriteLine(s1);
Console.WriteLine(s2);
答案是什么?相信看了上面你应该会了,就不揭晓咯
-----------------------以上内容属于原创,欢迎转载-------------------------------
s1="张三“
s2="李四“