C#学习笔记——数据类型篇

一、数据类型

请添加图片描述

1、数据类型

1>类型分类

  • 通用类型系统CTS(Common Type System)是 .NET 框架中的一个组成部分,为所有面向 .NET 框架的语言定义了数据类型的规则;
  • 值类型:存储数据本身
  • 引用类型:存储数据的引用(内存地址)

2>类型归属

请添加图片描述
在这里插入图片描述

2、内存分配

1>内存

  • 是CPU与其他外部存储器交换数据的桥梁;
  • 用于存储正在执行的程序与数据,即数据必须加载到内存才能被CPU处理;
  • 通常开发人员表达的"内存"都是指内存条。

2>分配

  • 程序运行时,CLR将申请的内存空间从逻辑上进行划分;
  • 栈区:
    –空间小(1MB),读取速度快
    用于存储正在执行的方法,分配的空间兼做栈帧。栈帧中存储方法的参数以及变量等数据。方法执行完毕后,对应的栈帧将被清除。
  • 堆区:
    –空间大,读取速度慢
    用于存储引用类型的数据。

3、局部变量

  • 定义在方法内部的变量
  • 特点:
    –没有默认值,必须自行设定初始值,否则不能使用
    –方法被调用时,存在栈中,方法调用结束时从栈中清除

1>值类型与引用类型

  • 值类型:
    声明在栈中,数据存储在栈中

  • 引用类型:
    声明在栈中,数据存储在堆中,栈中存储该数据的引用

  • 理解:
    1、因为方法执行在栈中,所以在方法中声明的变量都在栈中
    2、因为值类型直接存储数据,所以数据存储在栈中
    3、又因为引用类型存储数据的引用,所以数据在堆中,栈中存储数据的内存地址

2>垃圾回收器

  • GC(Garbage Collection)是CLR中一种针对托管堆自动回收释放内存的服务;
  • GC线程从栈中的引用开始跟踪,从而判定哪些内存是正在使用的,若GC无法跟踪到某一块堆内存,那么认为这块内存不再使用,即为可回收的。

4、成员变量

  • 定义在类中方法外的变量
  • 特点:
    –具有默认值
    –所在类被实例化后,存在堆中,对象被回收时,成员变量从堆中清除
    –可以与局部变量重名

1>值类型与引用类型

  • 值类型:
    声明在中,数据存储在
  • 引用类型:
    声明在中,数据存储在的另一块空间

5、应用

1>比较

		static void Main()
        {
   

            int num01 = 1, num02 = 1;
            bool r1 = num01 == num02;//true,因为值类型存储的是数据,所以比较的时数据

            int[] arr01 = new int[] {
    1 }, arr02 = new int[] {
    1 };
            bool r2 = arr01 == arr02;//false,因为引用类型存储的时数据的引用,所以比较的是存储的引用
            bool r3 = arr01[0]== arr02[0];//ture
        }

2>赋值

		static void Main()
        {
   
            // 值类型                                   引用类型
            //int bool char                        string  Array

            //a在栈中   1在栈中
            int a = 1;
            int b = a;
            a = 2;
            Console.WriteLine(b);//?

            //arr在栈中存储数组对象的引用(内存地址)   1在堆中
            int[] arr = new int[] {
    1 };
            int[] arr2 = arr;
            //arr2[0] = 2;//修改的是堆中的数据
            arr = new int[]{
   2};//修改的是栈中存储的引用
            Console.WriteLine(arr2[0]);//?

            string s1 = "男";
            string s2 = s1;
            s1 = "女";//修改的是栈中存储的引用
            //s1[0]='女';//堆中的文字  不能修改
            Console.WriteLine(s2);//?

            // o1 在栈中   数据1 在堆中
            object o1 = 1;
            object o2 = o1;//o2得到的是数据1 的地址
            o1 = 2;//修改的是栈中o1存储的引用
            Console.WriteLine(o2);//?

        }

图一

图二
图三

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聪 ~smart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值