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


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

    F12进到类型的内部去查看

    是 class 就是引用类型

    是 struct 就是值

    2.语句块

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

    3.变量的生命周期 

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

    4.结构体中的值和引用 

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

    5.类中的值和引用 

    类本身是引用类型

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

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

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

    6.数组中的存储规则 

    数组本身是引用类型

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

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

    7.结构体继承接口 

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

    1. TestStruct obj1 = new TestStruct();
    2. obj1.Value = 1;
    3. Console.WriteLine(obj1.Value);
    4. TestStruct obj2 = obj1;
    5. obj2.Value = 2;
    6. Console.WriteLine(obj1.Value);
    7. Console.WriteLine(obj2.Value);
    8. ITest iobj1 = obj1;//装箱 value 1
    9. ITest iobj2 = iobj1;
    10. iobj2.Value = 99;
    11. Console.WriteLine(iobj1.Value);
    12. Console.WriteLine(iobj2.Value);
    13. TestStruct obj3 = (TestStruct)iobj1;//拆箱
  • 相关阅读:
    【个人原创项目】开发问答社区-V1.0
    pytest运行时参数说明,pytest详解,pytest.ini详解
    正则验证用户名和跨域postmessage
    SANs证书是什么?
    媒体发稿:为什么选择国内媒体推广一文带你领略其魅
    不再使用步长卷积或池化:针对低分辨率图像和小物体的新的CNN构建块
    【基于YOLOv8的教室人脸识别 附源码 数据集】
    Nignx服务器,项目部署和Yapi,Swagger工具
    Vmware虚拟机创建快照、克隆和备份 创建文件夹共享方法
    基于CGAN增强陷窄带干扰信号的通信系统测试
  • 原文地址:https://blog.csdn.net/weixin_45274937/article/details/126663984