框架设计准则

一:命名准则:

类和变量名采用帕斯卡命名法(每一个单词的首字母都大写),函数的参数名字,采用第一个单词的首字母小写,剩下单词的首字母大写

二:类型设计准则

在类与结构体之间选择

1.首先,类是引用类型,在堆上分配内存,需要GC回收,结构体是值类型,在栈上分配内存,不需要GC,在作用域结束后,释放内存,因此值类型的分配和释放通常比引用类型的分配和释放开销更低

2.包含值为引用类型的数组,里面存储的是对堆上引用类型的引用地址,包含值为值类型的数组,里面存储的是栈上值类型的真实值,所以值类型数组的分配和释放比引用类型数组的分配和释放开销更低,和1同理

3.当值类型集成接口时(接口是引用类型),需要对值类型进行装箱转换成引用类型,它们在转回值类型时会被拆箱。 因为箱是在堆上分配的对象并会被垃圾回收,所以过多的装箱和拆箱会对堆、垃圾回收器以及最终应用程序的性能产生负面影响。 相反,在转换引用类型时不会发生这样的装箱

4.再次,引用类型的赋值复制引用,而值类型的赋值复制整个值。 因此,大型引用类型的赋值比大型值类型的赋值开销更低。

下面情况考虑定义结构体而不是类的实例:
  • 如果该类型的实例较小且通常为短生存期,或者通常嵌入到其他对象中。
  • 它以逻辑方式表示单个值,类似于基元类型(intdouble等)。
  • 它的实例大小小于 16 字节。
  • 它是不可变的。
  • 它不会频繁装箱
  • 其它情况应为类

2. 抽象类设计

  • 抽象类,只能作为父类,可以通过实例子类的方法,间接实例父类
  • 可以有抽象方法(没有方法体,且子类必须实现),非抽象方法(可以有方法体)
  • 可以有构造函数,但不能是私有的,因为如果是私有的,子类就无法在构造实例的时候访问到
  • 抽象方法只能声明到抽象类中

3.接口设计

  • 不要声明空接口
  • 声明了接口,最好有继承它的

4.结构体设计

不要为结构体声明无参的构造函数,遵循此原则将允许创建结构数组,而无需对数组的每个项运行构造函数,c#也不支持

不要声明可变类型属性,因为不可变类型,在修改其值的时候,是重新创建一个对象,替换掉原来的值(基本类型是不可变类型,引用类型是可变类型)

不可变类型:声明了之后,值不会再改变的,对于多线程之间的访问,很有用,不会引起线程冲突

声明为不可变类型的方法有:

目的是能够访问,但是不能够修改其值,可以加上readonly const 关键字,或者只有get属性/把set 属性设置为private,这样外部就不能修改其值了、

readonly:可以和static一起使用,是类级别的(通过类名调用),如果单独使用,是对象级别的(通过对象调用),一开始可以不用赋值,可以在构造函数里面赋值,满足值不变性

const:类级别的(通过类名调用),声明的时候必须赋值,满足值不变性,不能用于数组,结构体

猜你喜欢

转载自blog.csdn.net/qq_37672438/article/details/105193162