任何被称为“类”的类型都是引用类型。
通常使用以下3个关键字来声明一个自己定义的引用类型:
(1)Class.
(2)Interface。
(3)Delegate。
当然,在C#中也有一些内建的引用类型:Dynamic ,Object,string
常见的引用类型,例如List,text.decoder。
-----------------------------
值类型大体可以分为结构和枚举两类。
其中结构又可以大体分为以下3中:
(1)数字型结构:常见的有int32,float,decimal等。
(2)布尔型结构:boolean
(3)用户自定义的结构。
所有的结构都是派生自抽象类型System.ValueType ,而System.ValueType本身有派生自System.Object。
值类型特征:
(1)值类型不派生出其他任何类型。
(2)值类型不需要从其他类型派生。
(3)值类型是不可变的。string也是不可变的,但是是引用类型。
(4)值类型是以值方式传递的。就是说值类型变量在进行传递时,会对值类型实例中的字段进行复制。例如方法中的实参传递,或者是一个返回类型为值类型的方法在返回时,返回的值类型中的字段会复制到调用者分配的内存中。值类型的主要优势在于不是必须作为对象在托管堆上分配,但是如果值类型实例过大,也会由于复制的缘故,而对性能产生影响。
(5)值类型实例有两种表示方式,分别是未装箱和已装箱。而装箱机制是指将值类型转化成引用类型。正是由于值类型不在托管堆中分配,不被垃圾回收,同时也无须通过指针来引用,因而值类型与引用类型存在很多区别。但是有很多情况需要获取和操作对值类型实例的引用。因而装箱机制为了应对这种情况,便应运而生。
(6)值类型派生自 System.ValueType(即 stuct 隐含的基类型是 System.ValueType ),而 System.ValueType 同样从 System.Object 派生而来,因此 System.ValueType 提供了和 System.Object 相同的方法,不过值得注意的是 System.ValueType 重写了 Equals 方法和 GetHashCode 方法。
----------------------------------
虽然值类型无须垃圾回收,也没有引用类型的额外数据,但是在传递参数,赋值等方面并不一行比引用类型的性能好,因为引用类型在处理这些功能的时候并不需要像值类型那样复制全部的数据。
---------------------------------
如果符合以下条件,作为开发者可以选择使用值类型而不是引用类型:
(1)类型的实例较小时。
(2)类型的实例较大时,不会作为方法的实参进行传递,或作为方法的返回值返回。
(3)由于值类型不能作为基类型来派生新的值类型或引用类型,因此目标类型中不能引入新的虚方法,以及所有的方法都不能是抽象的,最后所有方法都隐式密封。