1.类和结构之间的选择:
   首先了解值类型和引用类型在行为上的差异(引用类型在堆上分配,有垃圾收集器(GC)管理,而值类型要么在栈上面分配并在栈展开的时候释放,要么内联在容纳它的类型中并在容纳它的类型中被释放时释放.因此,与引用类型的分配与释放开销更低.
 引用类型的数组是非内联的,也就是说数组的元素只是一些引用,指向那些位于堆中的引用类型的实例.而值类型的数组是内联的.也就是数组的元素就是值类型的真正的实例.因此值类型的分配与释放的开销要比引用类型的分配和释放要小的多.
所以值类型的结构的使用有时是对性能的一个优化.
考虑定义结构而不是定义类--如果该类型的实例比较小而且生命周期比较短,或者被经常内嵌在其他对象中.
但是必须结构具备下面的类型:
   在逻辑上代表一个独立的值.
   它的实例的大小小于16字节
   它是不可变的
   它不需要经常被装箱.
装箱的过程是在堆上面分配一个对象,由GC管理.所以太多的装箱和拆箱会对程序的性能有负面的影响.
2.类和接口之间的选择.
优先采用类而不是接口.
要用抽象类而不是用接口来接触协定和实现之间的耦合.
要定义接口,如果需要提供一个多态的值类型层次结构的话.
考虑通过定义接口来达到多重继承相类似的效果.
3抽象类的设计
   1.由于抽象类不能实例化,如果给抽象类定义一个public的构造函数,会引起误解.所以要定义层protected或者内部构造函数.
   2.要为你发布的抽象类提供至少一个继承自该类的具体实现.
4.静态类的设计
  1.少用
  2.把静态类定义层抽象的,密封的,还要给一个私有的构造
因为如果不写构造函数的话,c#会自动在类中真假一个默认的protected的构造函数.如果不显示的定义的对后来维护和归档不会很好.
 5,结构的设计
   要为值类型提供IEquatable<T>.避免装箱操作
posted on 2006-12-10 21:09  何东建  阅读(413)  评论(0编辑  收藏  举报