这篇文章因为是和硬件存储有关,就尽量简单小白能看懂的方式说明
说到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的“==”操作符。
C#内存管理精要
1402

被折叠的 条评论
为什么被折叠?



