C#进阶09——值类型和引用类型2

发布时间:2024-11-11 10:01

1.如何判断 值类型和引用类型

F12进到类型的内部去查看

是 class 就是引用类型

是 struct 就是值

2.语句块

命名空间
   ↓
类、接口、结构体
   ↓
函数、属性、索引器、运算符重载等(类、接口、结构体)
   ↓
条件分支、循环
 
上层语句块:类、结构体
中层语句块:函数
底层的语句块:条件分支 循环等
 
我们的逻辑代码写在哪里?
函数、条件分支、循环-中底层语句块中
 
我们的变量可以申明在哪里?
上、中、底都能申明变量
上层语句块中:成员变量
中、底层语句块中:临时变量

3.变量的生命周期 

编程时大部分都是 临时变量
在中底层申明的临时变量(函数、条件分支、循环语句块等)
语句块执行结束
没有被记录的对象将被回收或变成垃圾
值类型:被系统自动回收
引用类型:栈上用于存地址的房间被系统自动回收,堆中具体内容变成垃圾,待下次GC回收
 
想要不被回收或者不变垃圾
必须将其记录下来
如何记录?
在更高层级记录或者
使用静态全局变量记录

4.结构体中的值和引用 

构体本身是值类型
前提:该结构体没有作为其他类的成员
在结构体中的值,栈中存储值具体的内容
在结构体中的引用,堆内存存储引用具体的内容
 
引用类型始终存储在堆中
真正通过结构体使用其中引用类型时只是顺藤摸瓜

5.类中的值和引用 

类本身是引用类型

在类中的值,堆中存储具体的值

在类中的引用,堆中存储具体的值

值类型跟着大哥走,引用类型一直在堆里

6.数组中的存储规则 

数组本身是引用类型

值类型数组,堆中房间存具体内容

引用类型数组,堆中房间存地址

7.结构体继承接口 

利用里氏替换原则,用接口容器装载结构体存在装箱拆箱 

            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;//拆箱

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号