[C#基础知识]之值类型与引用类型

来源:互联网 发布:淘宝抽奖转盘真的假的 编辑:程序博客网 时间:2024/04/27 19:41

1. 所有对象都继承自System.Object,而所有的值类型都继承自System.ValueType。也就是说,System.ValueType重写了System.Object的方法使得值类型的操作是基于值而不是基于引用。

 

2. 值类型内存分配在栈上,引用类型内存分配在托管堆中。内存分配在这两个地方的区别在于:如果超出了值类型定义的范围,值类型分配的内存会立刻从内存中清除,即它的内存生命周期是可以预测的。而引用类型分配在托管堆中,内存管理有垃圾处理器控制,不可预知其生命周期。

 

3. 赋值操作

值类型赋值操作是会依次copy所有成员变量的值。引用类型仅仅是地址重定向。

 

4. 参数传递

默认为值传递,即参数为值类型是传递值类型的值副本,参数为引用类型时传递引用类型地址值副本。但当参数使用out或者ref关键字是,传递的是引用本身。但是在使用ref,需要注意一些区别:

  • 当参数为引用类型时,不使用ref关键字,方法还是可以通过传入的引用改变其所指向的实例,但是不能改变引用本身。
  • 当参数为引用类型时,同时使用ref关键字,方法可以通过传入的引用改变其所指向的实例,并且改变引用本身。

5. 值类型是sealed的,不能继承

 

6. 值类型不能写Finalize()方法,该方法用于堆上的内存回收。

 

7. 装箱与拆箱

装箱 - 把值类型转换为引用类型。

拆箱 - 把引用类型转换为值类型。

作用:可以把值类型也看作是对象。最常使用的情况是在集合操作的时候,大多数方法接口都接收一个对象参数(object)。当传入值类型时,.NET会自动处理装箱细节,把值类型转变为引用类型。从集合取出时,把引用类型的值取出放回值类型变量。

缺点:性能上有损失。并且缺少类型安全保证。.NET 2.0推出了泛型 基本上能解决这个问题。