• 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;//拆箱
  • 相关阅读:
    一份超预期的期中成绩,拨开百果园“高价值迷雾”
    【DevOps】Git 图文详解(六):Git 利器 - 分支
    【WinRAR】去除请购买WinRAR许可
    MySQL递归查询所有子集
    安培龙IPO过会:年营收5亿 同创伟业与中移创新是股东
    IDEA自带的数据库连接工具连接(DM)达梦数据库
    【日积月累】后端刷题日志
    企业为何要挖掘专利和专利布局,如何做?
    特斯拉“断网”,数百车主“被锁车外”,马斯克道歉
    中职网络安全竞赛B模块新题
  • 原文地址:https://blog.csdn.net/weixin_45274937/article/details/126663984