发表于2013-07-26 22:02:20
1.首字母大写的类型与小写的类型,如String与string,Int32与int,前者为Framework类库(FCL)中存在的基本类型,后者是c#中方便用户使用的,与FCL类型对应的,编译器直接支持的数据类型,我们一般称为基元类型。基元类型最终会被编译成FCL中的基本类型!
2.所有枚举都从System.Enum 抽象类型派生,而System.Enum 和其它所有值类型都从System.ValueType派生,所有值类型都是隐式密封的(sealed),它无法被继承
3.如果要将某个类型定义成值类型,应考虑以几个条件
3.1 类型具有基无类型的行为。即这是一个十分简单的类型,其中没有成员会修改类型的任何实例字段。若一个类型没有提供会更改其字段的成员,就说该类型是不可变类型(immutable),事实上,对于许多值类型时来说,我们建议将他们的全部字段设为readonly
3.2 类型不需要从其它任何类型继承
3.3 类型也不会派生出其它任何类型
在满足以上条件时,同时还应满足以下任意一个条件
3.4 类型的实例较小(约为16字节或更小)
3.5 类型的实例较大(大于16字节),但不作为方法的实参传递,也不从方法返回
4.值类型对象有两种表示形式:未装箱(unboxed)形式与已装箱(boxed)形式,而引用类型总是处于已装箱形式
5.System.ValueType重写了Equals方法与GetHashCode方法,但是其默认实现存在性能问题,如果自定义值类型时,应重写Equals与GetHashCode方法,并提供它的显式实现!
6.将一个值类型的变量赋给另一个值类型变量,会执行一次逐字段复制。而引用类型,只复制内存地址
7.形参为Object类型时,传递值类型实参,会引发装箱boxing()操作,虽然ValueType派生自Object
8. 装箱操作过程:
8.1 在托管堆中分配好内存,分配的内存量是傎类型的各个字段所需要的内存量加个托管堆的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量
8.2 值类型的字段复制到新分配的堆内存
8.3 返回对象的地址
9.拆箱(unboxing)的代价要比装箱低,它是一个获取指针的过程,该指针指向的是已装箱实例中的未装箱部分,在拆箱操作发生时,往往会紧接着发生一次字段