C#中类型的派生

一、什么是类型

Type 又名数据类型(Data Type)
• A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values.
• 是数据在内存中存储时的“型号”
• 小内存容纳大尺寸数据会丢失精度、发生错误
• 大内存容纳小尺寸数据会导致浪费
• 编程语言的数据类型与数据的数据类型不完全相同
强类型语言与弱类型语言的比较
• 强类型:编写程序时,程序中的数据受到数据类型的约束,即强类型编程语言
• 弱类型:数据受类型约束不严格,或基本不受约束,即弱类型编程语言(如 JavaScript 动态类型)
• C# 从 4.0 开始引入了 Dynamic,让它可以利用动态语言的一些特性,但 C# 依然是强类型编程语言
变量的实质是:以变量名所对应的内存为起始地址,按该变量的类型所需的存储空间为长度的一块内存区域

二、类型的划分与派生

在这里插入图片描述
C#数据类型分为两大类:值类型(数据存放在栈stack中)和引用类型(数据存放在堆heap中,地址存放在栈stack中)。引用类型包括类、接口、委托,值类型包括结构体和枚举, 所有类型都以 Object 为自己的基类型
上图中第一列(object列)表示的是引用类型的类名(蓝色)与关键字(黑色),第二列表示常见的值类型的类名(蓝色)与关键字(黑色),第三了表示为某类型服务的特殊关键字

三、值类型与引用类型变量声明以及实例化过程

1、值类型

对于值类型变量在内存中的分配 较为简单,当声明一个值类型变量后,编译器会将一个空闲内存块的地址(栈区)与该变量名绑定,当我们对该变量进行操作时实际就是完成对给内存快的操作
例:
声明一个变量b为byte类型并赋值100,实际上编译器完成的工作就是在内存中找到一个空闲内存0x10000015并将100的二进制值写入该字节
在这里插入图片描述
在这里插入图片描述

2、引用类型

引用类型(数据存放在堆heap中,地址存放在栈stack中),引用类型变量所存储的是一个4字节长的堆区地址,以该堆区地址为起始存放的是该变量 的实际参数。
例:
定义一个学生类(引用类型),并对其去实例化赋值

class Program
{
    static void Main(string[] args)
    {
        Student stu ;
        stu = new Student();
        stu.Age = 1;

    }

    class Student
    {
        public static int Amout;
        public int Age;
        public string Name;
    }
}

这一过程中编译器实际完成的工作是:1、声明该引用类型变量时为其在栈区找到一块四字节内存空间并将初始地址与该变量名(stu)绑定
在这里插入图片描述
2、当对stu实例化时,编译器会在堆区找到一块对应该类大小的内存空间并将该内存块起始地址复制给stu
在这里插入图片描述
3、对stu内部成员变量赋值,实际就是通过栈区地址找到堆区地址,再根据该成员变量在类中位置修改对应内存。

四、装箱与拆箱

装箱和拆箱是值类型和引用类型之间的相互转换。装箱是值类型向引用类型转换时发生的,拆箱是引用类型向值类型转换时发生的。
例:
装箱

int a = 100;
object x;
x = a;

定义一个值类型a赋值100,实际就是在栈地址0x10000027位置开始的四个字节写入100对应二进制,将值类型a赋值给引用类型x的过程称为装箱,x不会直接a的内容作为引用地址(可能会访问到系统关键位置),而是将a的内容存放的堆区中,并将堆区地址写入到x
在这里插入图片描述
拆箱

int a = 100;
object x;
x = a;
int b = (int)x;

将引用类型变量x的值赋值给b的过程实际上是,是将x中存储的堆区地址0x30000010中的内容赋值b,这过程就叫做拆箱
在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读