C#类型
引用类型(包括三个类类型object,string,class name;接口类型interface;数组定义和委托定义 delegate name):引用变量中保存的是对象的内存地址(委托是一种数据结构,能引用一个或多个方法)。
其特点如下:
- 需要在委托中为引用类型变量分配内存。
- 用new创建引用类型变量,并返回创建对象的地址。
- 引用类型变量是由垃圾回收机制来处理的。
- 多个引用类型变量可以引用同一对象,对一个变量的操作会影响到另一个变量所引用的同一对象。
- 引用类型变量在被赋值前的值都是null。
从本质上来讲,引用一般是靠指针实现,所以引用也一定要有一个空间来存放的,只是这个空间不需要程序员自己来care,也不会对效率有任何的影响。所以总是说,引用是变量的一个别名,对引用的操作就是针对其引用的对象。
值类型:存储应用数值。
其特点如下:
- 值类型变量被保存在堆栈中。
- 访问值类型变量时,一般直接访问其实例名。
- 每个值类型变量都有本身的(数据)副本,所以对一个值类型变量的操作不会影响到其他变量。
- 值类型变量复制时,复制的是变量的值,而不是地址。
- 值类型变量的值不能是null。
变量
object型:可表示任何类型的值。
任何变量使用之前都必须初始化。
常量
值固定不变,在编译时就确定。分为文本常量和符号常量。文本常量是输入到程序中的值;符号常量代表内存地址的名称,定义后就无法修改。
定义常量之前必须用const开头。
const int MONTHS=12,这样就能在程序中用MONTHS了,不用12。
装箱
值类型转换为引用类型。
- 任何值类型到类型object的转换。
- 任何值类型到类型System.Value.Type的转换。
- 任何值类型到值类型的接口的转换。
- 任何枚举类型到类型System.Enum的转换。
装箱过程:
结果:
所以值变量复制的时候只复制了值50给引用变量;之后再改变值变量的值也不会影响引用变量的值。
拆箱
引用类型转换为值类型。
- 从类型object到任何的值类型的转换。
- 从类型System.ValueType到任何的值类型的转换。
- 从任何的接口类型到对应的任何值类型的转换。
- 从类型System.Enum到任何枚举类型的转换。
拆箱过程:(取消装箱 将引用类型直接复制出来)
这里,chaixiang的类型必须和yinyong的类型一致,否则会报错(也就是说拆箱之前,必须要知道object是从哪个类型装的箱)。
结果: