在C#中,变量的类型就属引用类型,值类型,以及他们之间相互的转换比较难理解,里面更是涉及到了类型在内存中的存储结构,本文通过内存,栈,堆,值类型,引用类型的关系,以及相互转换时产生的装拆箱操作,来给大家梳理一下其中的过程,拨开各种层层的技术迷雾,探究其真正的本质。如果大家对过程产生疑问或者描述过程有错误的地方,欢迎在评论区中多多指正,大家一起学习,一起进步!
内存内存的物理结构
在讲数据结构之前,和大家先一起回顾下内存的物理结构是啥,内存的物理结构比较简单,大部分人都见过内存条:抽象出来之后的内存条模型:
内存实际上是一种名为内存IC的电子元件,内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址,来进行数据的读写。VCC和GND是电源,A0~A9是地址信号的引脚,D0~D7是数据信号的引脚,RD和WR是控制信号的引脚。将电源连接到VCC和GND后,就可以给其他引脚传递比如0或者1这样的信号。大多数情况下,+5V的直流电压表示1,0V表示0。
上面的内存IC能存储多少数据呢,数据信号引脚有D0~D7共八个,表示一次可以输入输出8位(=1字节)的数据。此外,地址信号引脚有A0~A9共十个,表示可以指定~共个地址。而地址用来表示数据的存储场所,因此我们可以得出这个内存IC中可以存储个1字节的数据。因为=1K,所以该内存IC的容量就是1KB。
现在大家使用的计算机至少有M的内存。这就相当于000个(MB÷1KB=000K)1KB的内存IC。当然,一台计算机中不太可能放入如此多的内存IC。通常情况下,计算机使用的内存IC中会有更多的地址信号引脚,这样就能在一个内存IC中存储数十兆字节的数据。因此,只用数个内存IC,就可以达到MB的容量。如上实图1GB的内存条,引脚比较多。
内存的读写
内存的写入的实现,我们继续来看刚才所说的1KB的内存IC。首先,我们假设要往该内存IC中写入1字节的数据。为了实现该目的,可以给VCC接入+5V,给GND接入0V的电源,并使用A0~A9的地址信号来指定数据的存储场所,然后再把数据的值输入给D0~D7的数据信号,并把WR(write=写入的简写)信号设定成1。执行完这些操作,就可以在内存IC内部写入数据(如下图中的a)了。
内存的读取的实现,读出数据时,只需通过A0~A9的地址信号指定数据的存储场所,然后再将RD(read=读出的简写)信号设成1即可。执行完这些操作,指定地址中存储的数据就会被输出到D0~D7的数据信号引脚(下图中的b)中。
另外,像WR和RD这样可以让IC运行的信号称为控制信号。其中,当WR和RD同时为0时,写入和读出的操作都无法进行。
内存IC内部有大量可以存储8位数据的地方,通过地址指定这些场所,之后即可进行数据的读写。
内存的逻辑模型
内存的逻辑模型可以简单理解为每层都存储着数据的楼房,在这个楼房中,1层可以存储1个字节的数据,楼层号表示的就是地址。同时并不需要过多地