通用类型系统概述

时间:2022-07-08 15:47:04

    今天晚上看了.net 通用类型  的结构 , 以前没有对它深入学习,对ta 的认识很很局限, 只知道怎么用,不懂原理,就像俗话说的知其然不知其所以然。  以前对这些基础知识掌握的不牢靠,  现在想通过 写博文的方式加强记忆, 写的不好的地方还请大家 指出 ,我们一起讨论 ....  (本人表达能力急待加强,汗颜 ~~~~~)

    C#有两种类型的数据一种是是值类型数据,一种引用类型数据。

  一下是MSDN的类型图 :

通用类型系统概述

   

值类型:值类型的实例代表实际的数据 如(int,float,bool,struct定义的类型 -à datatime)

引用类型:引用类型的实例代表指向数据的指针或者引用 如(string,数组,class 定义的类型)

两种类型的存储方式

值类型:存储在堆栈中即栈。

引用类型:引用对象的地址存储在栈中,实际的值存储托管堆上

.net 对两种类型的引用流程为:

.net的程序首先要被编译为IL(中间语言),之后再托管执行。值类型直接在堆栈里面取值就可以,儿引用类型必须要从堆栈里面取出ta 的地址,在根据这个地址到堆里面找到对应的值 

以下是值类型和引用类型的具体区别

 

值类型

引用类型

内存分配地点

分配在栈中

分配在堆中

效率

效率高,不需要转换地址

效率低,需要进行地址转换

内存回收

使用完后,理解回收

使用完后,不是立即回收,而是通过GC回收

赋值操作

进行复制,创建一个同值新对象

只是对原有对象的引用

函数参数与返回值

是对象的复制

是对原有的对象的引用,而不产生新的对象

易扩展性

不易扩展

容易扩展,方便与类型扩展

值类型剖析

1、         C#中的所有值类型均隐式派生自system.ValueType。

2、         每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值:

例如: int i=new int();

等价于  Int32 i=new Int32();

等价于  int i=0;

等价于  Int32 i=0;

  使用new运算符是,将调用特定类型的默认构造函数并对变量赋以默认的值。

注意:

1、         所有的值类型都是密封的(seal),所以无法派生出新的值类型。

2、         System.ValueType直接派生于System.Object。即System.ValueType本身是一个类类型,而不是值类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是按照引用地址来比较的