数据类型系统是一门编程语言的核心。.NET系列的语言使用统一的数据类型系统CTS(Common Type System)。全部的数据类型都继承自System.Object。编程
一 值类型和引用类型数组
a)面向对象语言最明显的特征即是:万物皆对象。但早期的面向对象语言却由于这一点存在性能上的问题。由于任何变量都要在堆上分配。CTS经过将数据类型分为值类型和引用类型解决了这个问题。安全
b) 值类型编程语言
值类型包括基元类型(Primitive Type,包括int,double,byte等)、枚举和结构体;这些类型的变量会保存在栈(stack)上;不能为空;操做数据时,直接操做栈上的值。性能
c)引用类型指针
引用类型包括类、数组、委托、接口;这类数据会保存在堆(Heap)上;能够为空;引用类型其实是类型安全的指针,类型安全意味着指针必定会指向堆上已经存在的对象,操做数据时,操做的是该指针。对象
二 装箱和拆箱继承
装箱和拆箱在保证“万物皆对象”的前提下,作到了对性能的提高。接口
a) 装箱就是将一个值类型的变量转换为引用类型;拆箱则反之。这一律念最重要的地方在于:“它使一个事物只有在须要是对象的时候才做为对象”。好比一个Int32类型的变量,保存在栈上,但它能够传递给任何从Sytem.Object衍生的对象,而实际上它只是一个保存在栈上、占用了4个字节的值。it
b) 值类型有不少种,但引用类型能够认为只有System.Object一种,因此装箱的时候,值类型的转换目标是明确的,在将值类型赋值给引用类型时会自动进行装箱。但拆箱时,须要人为指定要将引用类型转换为哪一种值类型。
三 System.Object
System.Object是全部对象的基类,全部对象都默认继承了System.Object类的方法。System.Object类具备以下几个方法:
public方法:
Equals:比较变量是否相等,若是两个变量引用同一个对象,这两个变量相等;对于值类型来讲,若是类型和值都相等,则认为变量相等。
GetHashCode:计算对象的哈希值时用。
GetType:反射时,用来取得对象的类型。
ToString:默认返回对象的名称。
ReferenceEquals:本书比较早,这个属性应该是后来版本的.NET中添加的,用于比较是否引用同一个对象。
protected方法:
Finalize:GC进行垃圾回收时用到。
MemberwiseClone:用于进行浅拷贝。
四 CTS类型与C#类型的对应
五 类型转换
根据里氏转换原则,可使用派生类来替换基类。若是假设基类为Employee,派生类为ContractEmployee:
a) 向上转换(upcast) 将派生类赋值给基类时进行向上转换,这种转换可自动进行(隐式转换)。
Employee e=new ContractEmployee();
b) 向下转换(downcast) 将基类转换为派生类时进行的是向下转换,须要显式转换。
这样的写法编译能够经过。只有在运行时才能够确认转换是否可以成功,若是转换失败,会抛出System.InvalidCastException异常。
另外,还可使用as关键字进行转换,使用这种方式就行向下转换时,运行时转换失败不会报错,会赋空值,因此要注意作好非空判断。