2023-09-14
自我提升
0

目录

值类型和引⽤类型

程序内存区域:堆 栈 静态存储区

  • 程序所有的数据,也就是所有的变量,都是存储在内存中的。
  • 栈空间⽐较⼩,但是读取速度快
  • 堆空间⽐较⼤,但是读取速度慢

商店和仓库

image.png

栈的特征:
数据只能从栈的顶端插⼊和删除

  • 把数据放⼊栈顶称为⼊栈(push)
  • 从栈顶删除数据称为出栈(pop)

image.png

内存中的栈,是由系统管理(.Net框架)。

我们之后会在数据结构中学习写⼀个⾃⼰的栈结构,保存数据。

堆是⼀块内存区域,与栈不同,堆⾥的内存能够以任意顺序存⼊和移除

image.png

GC Garbage Collector垃圾回收器
CLR的GC就是内存管理机制,我们写程序不需要关⼼内存的使⽤,因为这些都是CLR帮我们做了。类似新生宿舍楼

image.png

这⾥的某些概念,只需要了解和知道的,不需要知道内在核⼼原理,我们知道汽⻋的引擎 是汽⻋的核⼼动⼒来源,我们不需要知道引擎是怎么造。
同样,上述是编译器开发者的事情。

值类型和引⽤类型

类型被分为两种:

  • 值类型(整数,bool struct char ⼩数) 😀 默认值为0
  • 引⽤类型(string 数组 ⾃定义的类,内置的类) 😀 默认值为null

值类型只需要⼀段单独的内存

  • ⽤于存储实际的数据,(单独定义的时候放在栈中)

引⽤类型需要两段内存

  • 第⼀段存储实际的数据,它总是位于堆中
  • 第⼆段是⼀个引⽤,指向数据在堆中的存放位 (这里的引用是内存地址,类似酒店房间号)

image.png

注意

当我们使⽤引⽤类型赋值的时候,其实是赋值的引⽤类型的引⽤
如果数组是⼀个值类型的数组,那么数组中直接存储值,如果是⼀个引⽤类型的数组(数组中存储的是引⽤类型),那么数组中存储的是引⽤(内存地址)

c#
//新建类 Customer.cs class Customer { public string name; public string address; public int age; public string createTime; public Customer(string name, string address, int age, string createTime) { this.name = name; this.address = address; this.age = age; this.createTime = createTime; } public void Show() { Console.WriteLine("名字:" + name); Console.WriteLine("地址:" + address); Console.WriteLine("年龄:" + age); Console.WriteLine("创建时间:" + createTime); } }
c#
//使用 Program.cs int a = 123; float b = 34.5f; bool c = true; string name = "zhangsan"; int[] array1 = new int[] { 23, 23, 11, 32, 4, 2435 }; string[] array2 = new string[] { "www", "baidu", "com" }; Customer c1 = new Customer("张三", "上海", 13, "2022"); //引用对象的改变 Customer c2 = c1; c1.Show(); //输出中文张三 c2.Show(); //输出中文张三 c2.name = "zhangsan"; c2.Show(); //输出zhangsan c1.Show(); //输出zhangsan //将地址清空 c1 = null;//空 空引用 空对象 c2 = null;

image.png