本文引用《CLR Via C#》
设计自己的类型时,要仔细地考虑是否将其定义成值类型,而不是引用类型。某时候,值类型能够提供更好的性能,值类型的主要优势在于它们不作为对象在托管堆上分配。
满足以下全部条件适合将类型定义成值类型:
1. 类型具有基元类型的行为。换言之,这是一个十分简单的类型,其中没有成员会修改类型的任何字段。若一个类型没有提供会更改其字段的成员,就说该类型是不可变类型。事实上,对于许多值类型来说,我们都建议将其所有字段都标记为readonly(只读);
2. 类型不需要从任何类型继承;
3. 类型也不会派生出任何类型。
类型实例的大小也应考虑在内,因为在默认情况下,实参是以传值方式传递的,这会造成对值类型实例中的字段进行复制,从而损坏性能。同样的,被定义为返回一个值类型的一个方法在返回时,实例中的字段会复制到调用者分配的内存中,从而损坏性能。所有,要将一个类型定义成值类型,除了上述原因,还要满足以下条件:
1. 类型的实例较小(约16字节或更小);
2. 类型的实例较大,但不作为方法的实参,也不作为方法的返回值。