C#学习笔记24-值传递和引用传递

C#学习笔记24-值传递和引用传递

好久没更新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="李四“

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值