C# 变量申请内存地址

C#内存管理精要

这篇文章因为是和硬件存储有关,就尽量简单小白能看懂的方式说明

说到C#内存地址的问题就不得不说几个概念:

1.值类型和引用类型:

值类型和引用类型变量是很基础的问题,简单点来说常用的int,bool,float等就是C#中的值类型变量,而Interface、Class等均为引用类型变量。

那么值类型和引用类型变量有什么区别呢?简单直白的理解就是值类型在内存中是存储在堆栈上,而引用类型在内存中存储在托管堆上

那么问题又来了,这两种不同的存储有什么区别?简单来说值类型变量访问时直接访问堆栈上的存储的值即可,而引用类型需要从堆栈上访问到引用(指针),再根据指向的托管堆上的地址再访问到最后的值。所以如图:

更详细的值类型、引用类型介绍文章

2.装箱和拆箱

装箱和拆箱之前需要先知道一个知识点:所有的引用类型均继承自object

装箱、拆箱的过程简单来说就是将值类型转成引用类型(object)存储在托管堆上的过程(装箱)以及从引用类型中转回值类型的过程(拆箱)。很明显装箱、拆箱的过程会消耗更多的性能。

3.特殊的string类型

C#中有一种常用的类型,那就是字符串string,很多小白想当然的以为string是属于值类型,其实string类型是属于引用类型,它继承自object。

除此以外,string类型还有两个和一般的引用类型不同之处:

1)C#在string类型中重载“=”操作符,也就是常用的赋值语句,在C#中一般值类型的赋值语句是直接从堆栈上修改存储的值,而引用类型的赋值语句是在堆栈上取了一个别名,指向的托管堆地址仍然是同一块地址。但是,string类型的“=”赋值会申请一块新的地址,也就是说当你给字符串变量重新赋值后,其实已经修改了内存地址

2)C#在string类型中重载“==”操作符,也就是常用来判断是否相等的语句,一般的“==”判断的是是否为同一内存地址,也就是说哪怕里面的值内容相同,如果不是同一地址判断的结果也会是false。但是,string类型的“==”重载后判断的是值是否相同,因为每一次给字符串用赋值语句时,都会重新申请新的内存地址,所以判断地址肯定不会相等,没有任何意义,所以C#会重载string的“==”操作符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值