F12进到类型的内部去查看
是 class 就是引用类型
是 struct 就是值
命名空间
↓
类、接口、结构体
↓
函数、属性、索引器、运算符重载等(类、接口、结构体)
↓
条件分支、循环
上层语句块:类、结构体
中层语句块:函数
底层的语句块:条件分支 循环等
我们的逻辑代码写在哪里?
函数、条件分支、循环-中底层语句块中
我们的变量可以申明在哪里?
上、中、底都能申明变量
上层语句块中:成员变量
中、底层语句块中:临时变量
编程时大部分都是 临时变量
在中底层申明的临时变量(函数、条件分支、循环语句块等)
语句块执行结束
没有被记录的对象将被回收或变成垃圾
值类型:被系统自动回收
引用类型:栈上用于存地址的房间被系统自动回收,堆中具体内容变成垃圾,待下次GC回收
想要不被回收或者不变垃圾
必须将其记录下来
如何记录?
在更高层级记录或者
使用静态全局变量记录
构体本身是值类型
前提:该结构体没有作为其他类的成员
在结构体中的值,栈中存储值具体的内容
在结构体中的引用,堆内存存储引用具体的内容
引用类型始终存储在堆中
真正通过结构体使用其中引用类型时只是顺藤摸瓜
类本身是引用类型
在类中的值,堆中存储具体的值
在类中的引用,堆中存储具体的值
值类型跟着大哥走,引用类型一直在堆里
数组本身是引用类型
值类型数组,堆中房间存具体内容
引用类型数组,堆中房间存地址
利用里氏替换原则,用接口容器装载结构体存在装箱拆箱
- TestStruct obj1 = new TestStruct();
- obj1.Value = 1;
- Console.WriteLine(obj1.Value);
- TestStruct obj2 = obj1;
- obj2.Value = 2;
- Console.WriteLine(obj1.Value);
- Console.WriteLine(obj2.Value);
-
- ITest iobj1 = obj1;//装箱 value 1
- ITest iobj2 = iobj1;
- iobj2.Value = 99;
- Console.WriteLine(iobj1.Value);
- Console.WriteLine(iobj2.Value);
-
- TestStruct obj3 = (TestStruct)iobj1;//拆箱