值类型和引用类型、装箱和拆箱、new关键词的作用

一、值类型和引用类型的区别

值类型 引用类型
一般在线程栈上分配 必须从托管堆中分配,且从托管堆分配对象时,可能强制执行一次垃圾回收
值变量赋值是进行数据传递,两个值变量互不影响 引用类型赋值仅仅是把对象的引用指针赋值给变量,两个变量之间互相影响
值类型都继承自System.ValueType   引用类型都不继承自System.ValueType
不受垃圾回收的控制 受垃圾回收的控制

简单类型(int,byte,char,float,decimal,bool)

枚举类型

结构类型

类类型

接口类型

数组类型

委托类型

二、装箱和拆箱

  装箱是指将一个值类型转换为引用类型的过程

  拆箱是指将一个引用类型显式地转换成值类型

装箱做了那几件事?

1)、在托管堆中分配内存(内存量=值类型个字段所需要的内存量+类型对象指针和同步块索引的内存量)。

2)、值类型的字段复制到新分配的堆内存。

3)、返回对象地址。

拆箱做了那几件事?

1)、根据指针获取该指针指向包含一个对象中的原始值类型。

既然装箱做了这么多的事情,所以我们要斟酌使用,多数情况使用泛型来应对,一个方法试用于多种类型的情况。

三、new关键词做了几件事情

1)、计算字节总数(计算类型及其所有基类型中定义的所有实例字段需要的字节数+每个对象的类型对象指针和同步块索引需要的字节数。

2)、从托管堆中分配类型要求的字节数,从而分配对象内存,分配的所有字节都设为0。

3)、初始化对象的类型对象指针和同步块索引

4)、调用类型的实例构造器,传递new调用中指定实参(如果有)。ps:大多数编译器都在构造器中自动生成代码来调用基类构造器,每个类型的构造器都负责初始化该类型定义的实例字段,最终调用System.Object的构造器,该构造器什么也不做,简单的返回对象指针。

原文地址:https://www.cnblogs.com/zk3113/p/5958172.html