一.数据类型

1.1类型分类

通用类型系统CTS(Common Type System)是.NET框架中的一个组成部分,为所有面向.NET框架的语言定义了数据类型的规则。

  • 值类型:存储数据本身
  • 引用类型:存储数据的引用(内存地址)

1.2类型归属

二.内存分配

2.1内存

  • 内存是CPU与其他外部存储器交换数据的桥梁。

  • 用于存储正在执行的程序与数据,即数据必须加载到内存才能CPU处理

  • 通常开发人员表达的“内存”都是指内存条

2.2分配

程序运行时,CLR将申请的内存空间从逻辑上划分为栈区和堆区

栈区:

  • 空间小(1MB),读取速度块。
  • 用于存储正在执行的方法,分配的空间叫做栈帧。栈帧中村塾方法的参数以及变量等数据。方法执行完毕后,对用的栈帧将被清除。

堆区:

  • 空间大,读取速度慢
  • 用于存储引用类型的数据

三.局部变量

局部变量是定义在方法内部的变量。局部变量有以下特点:

  • 没有默认值,必须自行设定初始值,否则不能使用。
  • 方法被调用时,存在栈中,方法调用结束时从栈中清除。

3.1 局部变量的值类型与引用类型

值类型:

声明在栈中,数据存储在栈中

引用类型:

声明在栈中,数据存储在堆中,栈中存储该数据的引用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 数据类型
/// </summary>
namespace Day6
{
    class Program
    {
        static void Main(string[] args)
        {
            //局部变量:在方法内部声明的变量
            //因为方法执行在栈中,所以在方法内部声明的变量都在栈中
            int a;
            a = 1;//因为值类型直接存储数据,所以数据1在栈中。
            int[] arr;//在栈中,存储数组的引用(内存地址)
            arr = new int[] { 1 };//因为引用类型存储在堆中,所以元素在堆中,栈中存储数据的引用
        }
    }
}

static void Main()
{
    string s1 = "a";
    string s2 = s1;
    s1 = "b"; //修改栈中存储的引用(指向b)
    Console.WriteLine(s2);//? --> a
}

画图

static void Main()
{
    string[] array = new string[] {"a","b"};
}

四.成员变量

成员变量是定义在类总方法外的变量

特点

  • 具有默认值
  • 所在类被实例化后,存在堆中,对象被回收时,成员变量从堆中清除
  • 可以与局部变量重名

4.1 成员变量的值类型与引用类型

值类型:

声明在堆中,数据存储在堆中。

引用类型:

声明在堆中,数据存储在堆的另一块空间

五.拆装箱

4.1 装箱 box

值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程

内部机制:

1.在堆中开辟内存空间

2.将值类型的数据赋值到堆中

3.返回堆中新分配对象的地址

4.2拆箱 unbox

从object类型到值类型或从接口类型到实现该接口的值类型的显式转换。

内部机制:

1.判断给定类型是否是装箱时的类型

2.返回已装箱示例中输入原值类型字段的地址

4.3 注意

  • 拆箱后的类型必须与装箱时的类型相同
  • 伴随拆箱的字段复制步骤不属于拆箱过程
  • 装箱和拆箱不是互逆的过程,装箱的性能开销远大于拆箱。

六.枚举

枚举主要包含简单枚举、标志枚举、按位运算符

5.1简单枚举

列举某种数据的所有取值

  • 作用:增强代码的可读性,限定取值
  • 语法:enum 名字{值1,值2,值3,值4}
  • 枚举元素默认为int,准许使用的枚举类型由byte、sbyte、short、ushort、int、uint、long或ulong
  • 每个枚举元素都有枚举值。默认情况下,第一个枚举的值为0,后面每个枚举的值依次递增1,可以修改值,后面枚举数的值依次递增

5.2标志枚举

5.3 按位运算符

按位或运算:

对应的两个二进制位有1个为1时,结果位为1。

用于同时选择多个枚举值

例如:2与3 做按位或运算,结果仍然为3

0010|0011 ==> 0011

按位与运算:

对应的两个二进制位都为1时,结果位为1

用于判断标志枚举是否包含某个枚举值。

例如:2与3 做按位与运算,结果仍然位3

0010&0011 ==> 0010

七 相关代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 数据类型
/// </summary>
namespace Day6
{
    class Program
    {
        static void Main1(string[] args)
        {
            //局部变量:在方法内部声明的变量
            //因为方法执行在栈中,所以在方法内部声明的变量都在栈中
            int a;
            a = 1;//因为值类型直接存储数据,所以数据1在栈中。
            int[] arr;//在栈中,存储数组的引用(内存地址)
            arr = new int[] { 1 };//因为引用类型存储在堆中,所以元素在堆中,栈中存储数据的引用


            string s1 = "a";
            string s2 = s1;
            s1 = "b"; //修改栈中存储的引用(指向b)
            Console.WriteLine(s2);//?  a

            object o1 = 1;
            object o2 = o1;
            o1 = 2;
            Console.WriteLine(o2);//?  1

            string[] array = new string[] {"a","b"};


            string[] strArray = new string[2];
            //修改堆中存储的数组对象
            strArray[0] = "乔峰";
            Console.WriteLine(strArray[0]);
            //修改栈中存储的引用
            strArray = new string[] { };
        }
        //装箱 拆箱
        static void Main()
        {
            int n1 = 100;
            //装箱(性能消耗较大)
            object o1 = n1;
            //拆箱(性能消耗较大(备注:没有装箱大))
            int n3 = (int)o1;

            //同类型赋值(消耗性能最小)
            int n2 = n1;
        }
    }
}

发表评论

邮箱地址不会被公开。 必填项已用*标注