今天晚上看了.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()方法,从而对值类型按照实例的值来比较,而不是按照引用地址来比较的