image.png
●上图蓝色代表什么?基本(C#内建)数据类型:最基本的最基础的数据类型。

变量、对象与内存

image.png
●变量 = 以变量名所对应的内存地址为起点,以其数据类型所要求的的存储空间位长度的一块内存区域
●变量名表示(对应着)变量的值在内存中的存储位置

变量名其实就是地址,指向存储地址;每一个变量都对应着相应类型。变量类型其实就是告诉计算机系统往后数多少个字节,这段内存保存我变量的值。

如:int x =1;

●静态变量隶属于类,而不属于类的实例。
image.png

●Object->值类型变量

image.png
怎么理解“值类型变量 ”的存储?https://www.yuque.com/u25921175/yrvhq9/qg5o0q
○位数不足时,高位补0
○有正负值范围的变量类型,最高位判断正负
○怎么表示负值?按位取反 再 +1

●Object->引用类型变量

image.png
怎么理解 “引用类型变量” 的存储?https://www.yuque.com/u25921175/yrvhq9/cfzli6
引用类型变量原理:引用类型变量装的是实例地址。

●局部变量在Stack上分配内存

局部变量、形参在栈上;实例变量在堆上;全局变量,静态变量在静态区;动态内存分配在堆上开辟。
image.png
上述实例中,stu、stu2在main函数中作为局部变量分配到栈上;new Student()则作为实例在堆上开辟。

●变量的默认值

一旦变量在内存上分配好后,统统刷成0,这就是它的默认值。
疑问:要是声明一个本地变量(也叫局部变量),它会不会有默认值呢?
image.png
解答:如果在C语言、C++中会有默认值,C#为了避免不安全的代码出现,初始值不让编译过去,必须有赋值。

●常量 const

顺便讲一下变量的声明:

const int x =100;

其中const作为修饰符,代表常量,值不可被改变;变量名为x;初始化器为=。
image.png

●装箱与拆箱

拆箱和装箱实质上是值类型与引用类型之间的转换。

装箱简述:把栈上值类型的值封装成Object类型实例放在堆上
拆箱简述:把堆上值类型的值拆成我目标数据类型存储到栈上
拆箱和装箱会损失程序的性能

装箱:当我们的计算机发现Object对象引用的值,不是堆上的实例,而它是栈上的值类型的值的时候:
①把栈上的值类型值Copy到堆上(找一块可存储的空间)
②把地址转化成二进制,再把这个地址存储到obj变量对应的内存空间里面来,构成obj引用变量对堆上变量实例的引用(里面封装了刚才的整数,也叫装箱)
拆箱:想要obj在堆上面那个内存里存储的整数值怎么办?
把堆里面的整数值Copy到栈上(而不是地址)

  1. namespace TypeCSharp
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. int x = 100;
  8. //装箱
  9. object obj = x; //obj实际上是一个引用类型,在内存上分4个字节的内存单元
  10. //拆箱
  11. int y = (int)obj;
  12. }
  13. }
  14. class Student
  15. {
  16. uint ID;//值类型(32位)
  17. ushort Score;//值类型(16位)
  18. }
  19. }

1650892031(1).png