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代码。比如:在循环体

中可能存在多余的装箱,你可以简单采用提前装箱方式进行优化。

 

posted @ 2019-04-02 23:30  battle  阅读(238)  评论(0)    收藏  举报