c# 堆和栈 值类型和引用类型

我们把内存分为堆空间和栈空间

栈空间比较小,但是读取速度快
堆空间比较大,但是读取速度慢

栈的特征:
数据只能从栈的顶端插入和删除,想要把下面的数据取出删除只能先把上面的数据移除,把数据放入栈顶称为入栈,从栈顶删除数据称为出栈。
堆的特征:
堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除

GC Garbage Collector 垃圾回收器
CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。
例:在程序的堆里保存了3个对象,后来的程序中,其中一个对象不在被使用,垃圾回收器发现无主对象并释放它,垃圾收集之后,被释放对象的内存可以被使用

值类型和引用类型
类型被分为两种:值类型(整数,bool,struct,char,小数)和引用类型(string,数组,自定义的类,内置的类)
值类型值需要一段单独的内存,用于存储实际的数据,单独定义的时候放在栈空间里
引用类型需要两段内存:
第一段存储实际的数据,它总是位于堆中
第二段是一个引用,指向数据在堆中的存放位置(也可以称为对象在堆中存储的地址)
在引用类型中把a的值赋给b,其实是把a的引用地址赋给b,这样a和b指向同一块堆数值
gukr k = new gukr();//gukr是一个类
k.x = 100;
k.y = 100;
k.z = 100;

        gukr k2 = new gukr();
        k2.x = 500;
        k2.y = 300;
        k2.z = 600;

        k = k2;//当走到这步的时候其实是把k2的引用地址赋给k,所以k2和k指向一个堆空间中的下x,y,z。k之前在堆中的x,y,z被GC回收了,所以不管是k还是k2的指向的x都是一个x
        k2.x = 6;
        Console.WriteLine(k.x);

如果数组里存储的是值类型,那么数组中直接存储值,如果是存储的是引用类型,那么数组中存储的是引用类型的引用地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值