c# 值类型、引用类型
1、什么是值类型?
值类型就是将内存存储在栈内,由系统自动释放资源的数据类型。(值类型要初始化才能使用不能为null)。
值类型主要由结构(struct) 和枚举(enum)组成,主要分为以下几类。
1、整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong)
2、浮点型(Float、Double)
3、decimal
4、bool
5、用户定义的结构(struct)
2、什么是引用类型?
引用类型是由类型的实际值应用(类似于指针)。
如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。
引用类型将内存分配在堆中,初始化时默认为null。
引用类型是通过垃圾回收机制进行回收。
引用类型 包括类、接口、委托、数组以及内置引用类型object与string。
3、什么是装箱 ?
由于C#中所有的数据类型都是由基类System.Object继承而来的,则装箱就是值类型转换成引用类型的过程就叫做装箱。
例如:
int i=3;值类型
object ovalue=i; 这句就在进行装箱的操作。
装箱的内部操作。
装箱: 对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。
第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex)。
第二步:将值类型的实例字段拷贝到新分配的内存中。
第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。
拆箱:检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量
4、什么是拆箱?
拆箱则与装箱相反,拆箱就是将引用类型转换成值类型的过程就叫做拆箱。
例如:
int i=3;值类型
object ovalue=i; 这句就在进行装箱的操作。
int i=(int)ovalue;这句就是在进行拆箱操作。
5、装箱/拆箱对执行效率的影响(如何优化效率)
装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。 那该如何做呢?
避免装箱的方法:
1、通过重载函数来避免。
2、通过泛型来避免。
凡事并不能绝对,假设你想改造的代码为第三方程序集,你无法更改,那你只能是装箱了
。 对于装箱/拆箱代码的优化,由于C#中对装箱和拆箱都是隐式的,所以,根本的方法是对
代码进行分析,而分析最直接的方式是了解原理结何查看反编译的IL代码。比如:在循环体
中可能存在多余的装箱,你可以简单采用提前装箱方式进行优化。

浙公网安备 33010602011771号